{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# spaCyチュートリアル\n",
    "#### 03 spaCy上級"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import spacy\n",
    "from spacy.gold import GoldParse\n",
    "from spacy.scorer import Scorer\n",
    "from spacy.util import decaying, minibatch, compounding\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import random\n",
    "from sklearn.metrics import precision_score, recall_score, confusion_matrix, accuracy_score, f1_score, roc_auc_score, roc_curve\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "import scikitplot.plotters as skplt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## GPUの使用  \n",
    "GPU版spaCyは対応するCUDAバージョンを指定してインストールします。GPU版spaCyはNumPyの代わりにGPUで高速計算可能な[CuPy](http://learningsys.org/nips17/assets/papers/paper_16.pdf)を使用しています"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# !pip install -U spacy[cuda100]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# GPUが有効か確認する\n",
    "spacy.prefer_gpu()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<CUDA Device 0>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 最初のGPUカードを使用する\n",
    "spacy.util.use_gpu(0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## モデル学習"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "SpaCyのモデルを一から学習したり、学習済みモデルを再学習することが可能です。文書分類や固有表現抽出には特に有効です。  \n",
    "\n",
    "1. ランダムな重みでモデルを初期化する。`nlp.begin_training`\n",
    "2. 現在の重みで学習データの内複数のデータを予測する。 `nlp.update`\n",
    "3. 予測と正解ラベルを比べる。\n",
    "4. 精度を向上させるように重みの更新方法を計算する（勾配）。\n",
    "5. 重みを若干更新する。\n",
    "6. 2から5を繰り返す。  \n",
    "\n",
    "ここでは実際に固有表現抽出モデルを学習します。  \n",
    "\n",
    "![model_training](img/model_training.png)  \n",
    "\n",
    "使うデータは[Hironsanの日本語用NERデータ](https://github.com/Hironsan/IOB2Corpus/blob/master/hironsan.txt)です。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# !wget https://github.com/Hironsan/IOB2Corpus/raw/master/hironsan.txt -P data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 日本語用NERデータをspaCy用に変換する"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def spaCy用nerデータ変換(ファイル名:str=None):\n",
    "    try:\n",
    "        ファイル=open(ファイル名, 'r')\n",
    "        全データリスト = []\n",
    "        文章 = ''\n",
    "        開始 = 0\n",
    "        データタプル = ()\n",
    "        ラベル辞書 = {}\n",
    "        固有表現リスト = []\n",
    "\n",
    "        for 行数, ライン in enumerate(ファイル, 1):\n",
    "            if ライン == '\\n':\n",
    "                全データリスト.append((文章, {\"entities\": 固有表現リスト}))\n",
    "                文章 = ''\n",
    "                開始 = 0\n",
    "                データタプル = ()\n",
    "                ラベル辞書 = {}\n",
    "                固有表現リスト = []\n",
    "\n",
    "            if ライン != '\\n':\n",
    "                ラインパース = ライン.split('\\t')\n",
    "                単語 = ラインパース[0]\n",
    "                固有表現 = ラインパース[len(ラインパース) - 1]\n",
    "                文章 += 単語.strip() + \" \"\n",
    "                固有表現 = 固有表現.strip()\n",
    "\n",
    "                if 固有表現 != 'O':\n",
    "                    固有表現 = 固有表現.split(\"-\")[1]\n",
    "                    開始位置 = 開始\n",
    "                    終了位置 = 開始 + len(単語)\n",
    "                    固有表現リスト.append((開始位置, 終了位置, 固有表現))\n",
    "\n",
    "                開始+=len(単語)+1\n",
    "    except:\n",
    "        print(\"しんでしまうとはなさけない\")\n",
    "        return None\n",
    "    return 全データリスト"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "全データ = spaCy用nerデータ変換('data/hironsan.txt')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "500"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(全データ)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 学習データと評価データに分ける\n",
    "学習データ = 全データ[0:400]\n",
    "評価データ = 全データ[400:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(400, 100)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(学習データ), len(評価データ)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 固有表現抽出を学習する"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "random.seed(0)\n",
    "\n",
    "# \"ja\"だとMeCabが必要だと怒られるので\"en\"で初期化。既に分かち書きされているので問題ないはず。\n",
    "nlp = spacy.blank(\"en\")\n",
    "ner = nlp.create_pipe(\"ner\")\n",
    "nlp.add_pipe(ner)\n",
    "\n",
    "# BILUO方式に変換する\n",
    "for _, アノテーション in 学習データ:\n",
    "    for 固有表現 in アノテーション.get(\"entities\"):\n",
    "        ner.add_label(固有表現[2])\n",
    "\n",
    "# Adam (1e-3, beta1=0.9, beta2-0.999, L2=1e-6)\n",
    "最適化法 = nlp.begin_training(device=0)\n",
    "    \n",
    "一意固有表現 = list(ner.move_names)\n",
    "\n",
    "# 不要なパイプラインを無効にするためコンポーネント名を所得する\n",
    "不要パイプ = [パイプ for パイプ in nlp.pipe_names if パイプ != \"ner\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['O',\n",
       " 'B-DAT',\n",
       " 'I-DAT',\n",
       " 'L-DAT',\n",
       " 'U-DAT',\n",
       " 'B-LOC',\n",
       " 'I-LOC',\n",
       " 'L-LOC',\n",
       " 'U-LOC',\n",
       " 'B-ORG',\n",
       " 'I-ORG',\n",
       " 'L-ORG',\n",
       " 'U-ORG',\n",
       " 'B-ART',\n",
       " 'I-ART',\n",
       " 'L-ART',\n",
       " 'U-ART',\n",
       " 'B-PSN',\n",
       " 'I-PSN',\n",
       " 'L-PSN',\n",
       " 'U-PSN',\n",
       " 'B-TIM',\n",
       " 'I-TIM',\n",
       " 'L-TIM',\n",
       " 'U-TIM',\n",
       " 'B-PNT',\n",
       " 'I-PNT',\n",
       " 'L-PNT',\n",
       " 'U-PNT',\n",
       " 'B-MNY',\n",
       " 'I-MNY',\n",
       " 'L-MNY',\n",
       " 'U-MNY']"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "一意固有表現"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 評価関数\n",
    "def 固有表現評価(nlp:spacy.lang.en.English=None, 評価データ:list=None):\n",
    "    scorer = Scorer()\n",
    "    \n",
    "    for テキスト, アノテーション in 評価データ:\n",
    "        文章 = nlp(テキスト)\n",
    "        ラベル = GoldParse(文章, entities=アノテーション['entities'])\n",
    "        scorer.score(文章, ラベル)\n",
    "        \n",
    "    return scorer.scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "def 固有表現学習(エポック数:int=5, 学習データ:list=None, 評価データ:list=None, 最大バッチ数:int=32):\n",
    "    with nlp.disable_pipes(*不要パイプ):  # 固有表現抽出だけ学習\n",
    "        学習状況 = []\n",
    "        ドロップアウト = decaying(0.5, 0.2, 0.3) # ドロップアウトを0.5から0.2に徐々に減少させる\n",
    "        バッチ数 = compounding(4.0, 最大バッチ数, 1.001)\n",
    "        \n",
    "        for エポック in range(エポック数):\n",
    "            random.shuffle(学習データ)\n",
    "            全バッチ = minibatch(学習データ, size=バッチ数)\n",
    "            損失 = {}\n",
    "\n",
    "            for バッチ in 全バッチ:\n",
    "                テキスト, ラベル = zip(*バッチ)\n",
    "                nlp.update(\n",
    "                    テキスト, \n",
    "                    ラベル, \n",
    "                    drop = next(ドロップアウト),\n",
    "                    sgd = 最適化法,\n",
    "                    losses=損失)\n",
    "            \n",
    "            print(f\"エポック: {エポック+1}\")\n",
    "            print(f\"損失: {損失}\")\n",
    "            評価スコア = 固有表現評価(nlp, 評価データ)\n",
    "            print(評価スコア)\n",
    "\n",
    "            学習状況.append(損失)\n",
    "            学習状況.append(評価スコア)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "エポック: 1\n",
      "損失: {'ner': 3667.394751776752}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 66.29834254143645, 'ents_r': 24.291497975708502, 'ents_f': 35.55555555555556, 'ents_per_type': {'ART': {'p': 0.0, 'r': 0.0, 'f': 0.0}, 'DAT': {'p': 70.76923076923077, 'r': 85.98130841121495, 'f': 77.63713080168776}, 'LOC': {'p': 53.06122448979592, 'r': 16.99346405228758, 'f': 25.742574257425744}, 'ORG': {'p': 0.0, 'r': 0.0, 'f': 0.0}, 'PNT': {'p': 0.0, 'r': 0.0, 'f': 0.0}, 'MNY': {'p': 0.0, 'r': 0.0, 'f': 0.0}, 'PSN': {'p': 0.0, 'r': 0.0, 'f': 0.0}, 'TIM': {'p': 100.0, 'r': 4.0, 'f': 7.6923076923076925}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "エポック: 2\n",
      "損失: {'ner': 1844.9096481208649}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 74.91289198606272, 'ents_r': 43.522267206477736, 'ents_f': 55.05761843790013, 'ents_per_type': {'ART': {'p': 88.88888888888889, 'r': 13.333333333333334, 'f': 23.18840579710145}, 'DAT': {'p': 82.72727272727273, 'r': 85.04672897196261, 'f': 83.8709677419355}, 'LOC': {'p': 62.96296296296296, 'r': 55.55555555555556, 'f': 59.02777777777778}, 'ORG': {'p': 0.0, 'r': 0.0, 'f': 0.0}, 'PNT': {'p': 0.0, 'r': 0.0, 'f': 0.0}, 'MNY': {'p': 0.0, 'r': 0.0, 'f': 0.0}, 'PSN': {'p': 0.0, 'r': 0.0, 'f': 0.0}, 'TIM': {'p': 96.875, 'r': 62.0, 'f': 75.60975609756096}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "エポック: 3\n",
      "損失: {'ner': 1306.6577428453315}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 74.19354838709677, 'ents_r': 46.558704453441294, 'ents_f': 57.2139303482587, 'ents_per_type': {'ART': {'p': 52.63157894736842, 'r': 16.666666666666664, 'f': 25.31645569620253}, 'LOC': {'p': 70.27027027027027, 'r': 50.98039215686274, 'f': 59.09090909090909}, 'DAT': {'p': 93.33333333333333, 'r': 91.58878504672897, 'f': 92.45283018867923}, 'PSN': {'p': 3.4482758620689653, 'r': 7.6923076923076925, 'f': 4.761904761904763}, 'ORG': {'p': 50.0, 'r': 1.1764705882352942, 'f': 2.298850574712644}, 'PNT': {'p': 0.0, 'r': 0.0, 'f': 0.0}, 'MNY': {'p': 0.0, 'r': 0.0, 'f': 0.0}, 'TIM': {'p': 95.45454545454545, 'r': 84.0, 'f': 89.36170212765958}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "エポック: 4\n",
      "損失: {'ner': 789.781903397539}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 71.35135135135135, 'ents_r': 53.441295546558706, 'ents_f': 61.111111111111114, 'ents_per_type': {'ART': {'p': 53.84615384615385, 'r': 23.333333333333332, 'f': 32.55813953488372}, 'DAT': {'p': 91.42857142857143, 'r': 89.7196261682243, 'f': 90.56603773584906}, 'PSN': {'p': 25.0, 'r': 38.46153846153847, 'f': 30.303030303030305}, 'LOC': {'p': 78.21782178217822, 'r': 51.633986928104584, 'f': 62.20472440944882}, 'ORG': {'p': 37.142857142857146, 'r': 30.58823529411765, 'f': 33.5483870967742}, 'PNT': {'p': 0.0, 'r': 0.0, 'f': 0.0}, 'TIM': {'p': 91.66666666666666, 'r': 88.0, 'f': 89.79591836734694}, 'MNY': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "エポック: 5\n",
      "損失: {'ner': 501.5080824612299}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 77.1513353115727, 'ents_r': 52.63157894736842, 'ents_f': 62.57521058965102, 'ents_per_type': {'ART': {'p': 66.66666666666666, 'r': 16.666666666666664, 'f': 26.666666666666668}, 'DAT': {'p': 89.0909090909091, 'r': 91.58878504672897, 'f': 90.32258064516128}, 'PSN': {'p': 23.076923076923077, 'r': 23.076923076923077, 'f': 23.076923076923077}, 'LOC': {'p': 78.0701754385965, 'r': 58.16993464052288, 'f': 66.66666666666666}, 'ORG': {'p': 43.58974358974359, 'r': 20.0, 'f': 27.41935483870968}, 'PNT': {'p': 100.0, 'r': 16.666666666666664, 'f': 28.57142857142857}, 'TIM': {'p': 93.18181818181817, 'r': 82.0, 'f': 87.2340425531915}, 'MNY': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "エポック: 6\n",
      "損失: {'ner': 372.9243900662627}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 69.29133858267717, 'ents_r': 53.441295546558706, 'ents_f': 60.342857142857156, 'ents_per_type': {'ART': {'p': 54.54545454545454, 'r': 10.0, 'f': 16.901408450704224}, 'LOC': {'p': 70.49180327868852, 'r': 56.209150326797385, 'f': 62.54545454545455}, 'DAT': {'p': 98.96907216494846, 'r': 89.7196261682243, 'f': 94.11764705882352}, 'ORG': {'p': 32.94117647058823, 'r': 32.94117647058823, 'f': 32.94117647058823}, 'PNT': {'p': 66.66666666666666, 'r': 16.666666666666664, 'f': 26.666666666666668}, 'TIM': {'p': 93.47826086956522, 'r': 86.0, 'f': 89.58333333333334}, 'MNY': {'p': 0.0, 'r': 0.0, 'f': 0.0}, 'PSN': {'p': 17.647058823529413, 'r': 23.076923076923077, 'f': 20.000000000000004}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "エポック: 7\n",
      "損失: {'ner': 254.24351515375412}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 67.85714285714286, 'ents_r': 57.692307692307686, 'ents_f': 62.36323851203501, 'ents_per_type': {'ART': {'p': 56.666666666666664, 'r': 28.333333333333332, 'f': 37.77777777777777}, 'LOC': {'p': 60.526315789473685, 'r': 60.130718954248366, 'f': 60.32786885245902}, 'DAT': {'p': 90.2654867256637, 'r': 95.32710280373831, 'f': 92.72727272727272}, 'PSN': {'p': 11.11111111111111, 'r': 15.384615384615385, 'f': 12.903225806451616}, 'ORG': {'p': 46.55172413793103, 'r': 31.76470588235294, 'f': 37.76223776223776}, 'PNT': {'p': 75.0, 'r': 25.0, 'f': 37.5}, 'MNY': {'p': 0.0, 'r': 0.0, 'f': 0.0}, 'TIM': {'p': 93.33333333333333, 'r': 84.0, 'f': 88.42105263157895}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "エポック: 8\n",
      "損失: {'ner': 213.6421376616493}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 72.26666666666667, 'ents_r': 54.8582995951417, 'ents_f': 62.37054085155352, 'ents_per_type': {'ART': {'p': 78.57142857142857, 'r': 18.333333333333332, 'f': 29.729729729729726}, 'LOC': {'p': 73.21428571428571, 'r': 53.59477124183007, 'f': 61.886792452830186}, 'DAT': {'p': 89.90825688073394, 'r': 91.58878504672897, 'f': 90.74074074074073}, 'ORG': {'p': 43.24324324324324, 'r': 37.64705882352941, 'f': 40.25157232704402}, 'PSN': {'p': 21.052631578947366, 'r': 30.76923076923077, 'f': 25.0}, 'PNT': {'p': 80.0, 'r': 33.33333333333333, 'f': 47.05882352941176}, 'MNY': {'p': 0.0, 'r': 0.0, 'f': 0.0}, 'TIM': {'p': 95.23809523809523, 'r': 80.0, 'f': 86.95652173913044}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "エポック: 9\n",
      "損失: {'ner': 176.88656200265217}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 70.69408740359897, 'ents_r': 55.66801619433198, 'ents_f': 62.2876557191393, 'ents_per_type': {'ART': {'p': 64.70588235294117, 'r': 18.333333333333332, 'f': 28.57142857142857}, 'LOC': {'p': 68.90756302521008, 'r': 53.59477124183007, 'f': 60.29411764705881}, 'DAT': {'p': 95.95959595959596, 'r': 88.78504672897196, 'f': 92.23300970873787}, 'PSN': {'p': 21.052631578947366, 'r': 30.76923076923077, 'f': 25.0}, 'ORG': {'p': 42.10526315789473, 'r': 37.64705882352941, 'f': 39.75155279503105}, 'PNT': {'p': 100.0, 'r': 33.33333333333333, 'f': 50.0}, 'TIM': {'p': 88.67924528301887, 'r': 94.0, 'f': 91.2621359223301}, 'MNY': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "エポック: 10\n",
      "損失: {'ner': 171.02378078766597}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 70.16706443914082, 'ents_r': 59.51417004048582, 'ents_f': 64.40306681270536, 'ents_per_type': {'ART': {'p': 66.66666666666666, 'r': 16.666666666666664, 'f': 26.666666666666668}, 'LOC': {'p': 70.54263565891473, 'r': 59.47712418300654, 'f': 64.53900709219859}, 'DAT': {'p': 89.65517241379311, 'r': 97.19626168224299, 'f': 93.27354260089686}, 'ORG': {'p': 41.935483870967744, 'r': 45.88235294117647, 'f': 43.82022471910113}, 'PNT': {'p': 100.0, 'r': 16.666666666666664, 'f': 28.57142857142857}, 'MNY': {'p': 50.0, 'r': 7.142857142857142, 'f': 12.5}, 'PSN': {'p': 25.0, 'r': 30.76923076923077, 'f': 27.586206896551722}, 'TIM': {'p': 93.47826086956522, 'r': 86.0, 'f': 89.58333333333334}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "エポック: 11\n",
      "損失: {'ner': 173.01600273232577}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 74.2782152230971, 'ents_r': 57.28744939271255, 'ents_f': 64.6857142857143, 'ents_per_type': {'ART': {'p': 72.72727272727273, 'r': 13.333333333333334, 'f': 22.535211267605636}, 'LOC': {'p': 74.78260869565217, 'r': 56.209150326797385, 'f': 64.17910447761194}, 'DAT': {'p': 96.07843137254902, 'r': 91.58878504672897, 'f': 93.7799043062201}, 'ORG': {'p': 41.66666666666667, 'r': 47.05882352941176, 'f': 44.19889502762431}, 'PNT': {'p': 100.0, 'r': 33.33333333333333, 'f': 50.0}, 'MNY': {'p': 0.0, 'r': 0.0, 'f': 0.0}, 'PSN': {'p': 57.14285714285714, 'r': 30.76923076923077, 'f': 40.0}, 'TIM': {'p': 93.47826086956522, 'r': 86.0, 'f': 89.58333333333334}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "エポック: 12\n",
      "損失: {'ner': 88.31914497031525}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 75.33875338753387, 'ents_r': 56.2753036437247, 'ents_f': 64.42641946697566, 'ents_per_type': {'ART': {'p': 50.0, 'r': 11.666666666666666, 'f': 18.918918918918916}, 'LOC': {'p': 75.0, 'r': 58.82352941176471, 'f': 65.93406593406593}, 'DAT': {'p': 93.51851851851852, 'r': 94.39252336448598, 'f': 93.95348837209302}, 'ORG': {'p': 43.75, 'r': 32.94117647058823, 'f': 37.58389261744966}, 'PSN': {'p': 37.5, 'r': 23.076923076923077, 'f': 28.57142857142857}, 'PNT': {'p': 100.0, 'r': 33.33333333333333, 'f': 50.0}, 'MNY': {'p': 33.33333333333333, 'r': 7.142857142857142, 'f': 11.76470588235294}, 'TIM': {'p': 91.66666666666666, 'r': 88.0, 'f': 89.79591836734694}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "エポック: 13\n",
      "損失: {'ner': 103.4679684750989}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 76.98863636363636, 'ents_r': 54.8582995951417, 'ents_f': 64.06619385342789, 'ents_per_type': {'ART': {'p': 64.28571428571429, 'r': 15.0, 'f': 24.324324324324323}, 'LOC': {'p': 73.04347826086956, 'r': 54.90196078431373, 'f': 62.68656716417911}, 'DAT': {'p': 93.57798165137615, 'r': 95.32710280373831, 'f': 94.44444444444446}, 'ORG': {'p': 52.27272727272727, 'r': 27.058823529411764, 'f': 35.65891472868217}, 'PNT': {'p': 100.0, 'r': 33.33333333333333, 'f': 50.0}, 'TIM': {'p': 83.92857142857143, 'r': 94.0, 'f': 88.67924528301886}, 'MNY': {'p': 0.0, 'r': 0.0, 'f': 0.0}, 'PSN': {'p': 20.0, 'r': 15.384615384615385, 'f': 17.391304347826086}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "エポック: 14\n",
      "損失: {'ner': 93.44313699249084}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 75.44910179640718, 'ents_r': 51.012145748987855, 'ents_f': 60.8695652173913, 'ents_per_type': {'ART': {'p': 54.54545454545454, 'r': 10.0, 'f': 16.901408450704224}, 'LOC': {'p': 71.1864406779661, 'r': 54.90196078431373, 'f': 61.992619926199254}, 'DAT': {'p': 93.06930693069307, 'r': 87.85046728971963, 'f': 90.38461538461539}, 'PSN': {'p': 23.076923076923077, 'r': 23.076923076923077, 'f': 23.076923076923077}, 'ORG': {'p': 45.45454545454545, 'r': 23.52941176470588, 'f': 31.007751937984494}, 'PNT': {'p': 100.0, 'r': 25.0, 'f': 40.0}, 'MNY': {'p': 0.0, 'r': 0.0, 'f': 0.0}, 'TIM': {'p': 95.45454545454545, 'r': 84.0, 'f': 89.36170212765958}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "エポック: 15\n",
      "損失: {'ner': 91.85960918123507}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 73.224043715847, 'ents_r': 54.25101214574899, 'ents_f': 62.32558139534884, 'ents_per_type': {'ART': {'p': 66.66666666666666, 'r': 10.0, 'f': 17.39130434782609}, 'LOC': {'p': 65.625, 'r': 54.90196078431373, 'f': 59.78647686832741}, 'DAT': {'p': 91.07142857142857, 'r': 95.32710280373831, 'f': 93.15068493150685}, 'ORG': {'p': 56.81818181818182, 'r': 29.411764705882355, 'f': 38.759689922480625}, 'PSN': {'p': 18.181818181818183, 'r': 30.76923076923077, 'f': 22.857142857142858}, 'PNT': {'p': 100.0, 'r': 33.33333333333333, 'f': 50.0}, 'MNY': {'p': 0.0, 'r': 0.0, 'f': 0.0}, 'TIM': {'p': 91.48936170212765, 'r': 86.0, 'f': 88.65979381443299}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "エポック: 16\n",
      "損失: {'ner': 89.76688704240144}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 74.14248021108179, 'ents_r': 56.882591093117405, 'ents_f': 64.37571592210767, 'ents_per_type': {'ART': {'p': 58.82352941176471, 'r': 16.666666666666664, 'f': 25.97402597402597}, 'LOC': {'p': 69.53125, 'r': 58.16993464052288, 'f': 63.345195729537366}, 'DAT': {'p': 92.72727272727272, 'r': 95.32710280373831, 'f': 94.00921658986175}, 'PSN': {'p': 20.0, 'r': 23.076923076923077, 'f': 21.428571428571427}, 'TIM': {'p': 86.79245283018868, 'r': 92.0, 'f': 89.32038834951457}, 'ORG': {'p': 54.0, 'r': 31.76470588235294, 'f': 40.0}, 'PNT': {'p': 80.0, 'r': 33.33333333333333, 'f': 47.05882352941176}, 'MNY': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "エポック: 17\n",
      "損失: {'ner': 86.52518495317938}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 75.27472527472527, 'ents_r': 55.465587044534416, 'ents_f': 63.86946386946387, 'ents_per_type': {'ART': {'p': 66.66666666666666, 'r': 10.0, 'f': 17.39130434782609}, 'LOC': {'p': 67.66917293233082, 'r': 58.82352941176471, 'f': 62.93706293706294}, 'DAT': {'p': 92.66055045871559, 'r': 94.39252336448598, 'f': 93.51851851851852}, 'PSN': {'p': 20.0, 'r': 23.076923076923077, 'f': 21.428571428571427}, 'TIM': {'p': 93.61702127659575, 'r': 88.0, 'f': 90.72164948453609}, 'ORG': {'p': 59.523809523809526, 'r': 29.411764705882355, 'f': 39.37007874015749}, 'PNT': {'p': 57.14285714285714, 'r': 33.33333333333333, 'f': 42.10526315789474}, 'MNY': {'p': 50.0, 'r': 7.142857142857142, 'f': 12.5}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "エポック: 18\n",
      "損失: {'ner': 60.31696663699408}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 72.29551451187335, 'ents_r': 55.465587044534416, 'ents_f': 62.77205040091639, 'ents_per_type': {'ART': {'p': 57.14285714285714, 'r': 13.333333333333334, 'f': 21.62162162162162}, 'LOC': {'p': 66.17647058823529, 'r': 58.82352941176471, 'f': 62.28373702422145}, 'DAT': {'p': 94.28571428571428, 'r': 92.5233644859813, 'f': 93.39622641509435}, 'PSN': {'p': 13.636363636363635, 'r': 23.076923076923077, 'f': 17.14285714285714}, 'TIM': {'p': 89.79591836734694, 'r': 88.0, 'f': 88.8888888888889}, 'ORG': {'p': 54.166666666666664, 'r': 30.58823529411765, 'f': 39.097744360902254}, 'PNT': {'p': 80.0, 'r': 33.33333333333333, 'f': 47.05882352941176}, 'MNY': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "エポック: 19\n",
      "損失: {'ner': 51.523959724629506}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 72.4867724867725, 'ents_r': 55.465587044534416, 'ents_f': 62.84403669724771, 'ents_per_type': {'ART': {'p': 66.66666666666666, 'r': 6.666666666666667, 'f': 12.12121212121212}, 'LOC': {'p': 67.42424242424242, 'r': 58.16993464052288, 'f': 62.456140350877185}, 'DAT': {'p': 91.74311926605505, 'r': 93.45794392523365, 'f': 92.59259259259261}, 'ORG': {'p': 55.10204081632652, 'r': 31.76470588235294, 'f': 40.298507462686565}, 'PSN': {'p': 15.384615384615385, 'r': 30.76923076923077, 'f': 20.512820512820515}, 'PNT': {'p': 100.0, 'r': 33.33333333333333, 'f': 50.0}, 'MNY': {'p': 0.0, 'r': 0.0, 'f': 0.0}, 'TIM': {'p': 88.46153846153845, 'r': 92.0, 'f': 90.19607843137256}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n",
      "エポック: 20\n",
      "損失: {'ner': 57.952082630850576}\n",
      "{'uas': 0.0, 'las': 0.0, 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}}, 'ents_p': 76.92307692307693, 'ents_r': 54.655870445344135, 'ents_f': 63.905325443786985, 'ents_per_type': {'ART': {'p': 61.904761904761905, 'r': 21.666666666666668, 'f': 32.098765432098766}, 'PSN': {'p': 13.043478260869565, 'r': 23.076923076923077, 'f': 16.666666666666668}, 'DAT': {'p': 92.5233644859813, 'r': 92.5233644859813, 'f': 92.5233644859813}, 'LOC': {'p': 75.0, 'r': 54.90196078431373, 'f': 63.39622641509435}, 'ORG': {'p': 59.45945945945946, 'r': 25.882352941176475, 'f': 36.0655737704918}, 'PNT': {'p': 100.0, 'r': 33.33333333333333, 'f': 50.0}, 'MNY': {'p': 0.0, 'r': 0.0, 'f': 0.0}, 'TIM': {'p': 95.74468085106383, 'r': 90.0, 'f': 92.78350515463917}}, 'tags_acc': 0.0, 'token_acc': 100.0, 'textcat_score': 0.0, 'textcats_per_cat': {}}\n"
     ]
    }
   ],
   "source": [
    "固有表現学習(エポック数=20, 学習データ=学習データ, 評価データ=評価データ, 最大バッチ数=128)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "!mkdir -p model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "# モデルを保存する\n",
    "nlp.to_disk('model/ja_ner_v1')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 重みを平均する (https://www.aclweb.org/anthology/P04-1015/)\n",
    "with nlp.use_params(最適化法.averages):\n",
    "    nlp.to_disk('model/ja_ner_v1_wa')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "nlp_wa = nlp.from_disk('model/ja_ner_v1_wa')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'uas': 0.0,\n",
       " 'las': 0.0,\n",
       " 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}},\n",
       " 'ents_p': 76.566757493188,\n",
       " 'ents_r': 56.882591093117405,\n",
       " 'ents_f': 65.27293844367014,\n",
       " 'ents_per_type': {'ART': {'p': 69.23076923076923,\n",
       "   'r': 15.0,\n",
       "   'f': 24.65753424657534},\n",
       "  'LOC': {'p': 70.76923076923077,\n",
       "   'r': 60.130718954248366,\n",
       "   'f': 65.01766784452296},\n",
       "  'DAT': {'p': 94.28571428571428,\n",
       "   'r': 92.5233644859813,\n",
       "   'f': 93.39622641509435},\n",
       "  'ORG': {'p': 57.14285714285714,\n",
       "   'r': 32.94117647058823,\n",
       "   'f': 41.791044776119406},\n",
       "  'PSN': {'p': 26.666666666666668,\n",
       "   'r': 30.76923076923077,\n",
       "   'f': 28.571428571428577},\n",
       "  'PNT': {'p': 80.0, 'r': 33.33333333333333, 'f': 47.05882352941176},\n",
       "  'MNY': {'p': 0.0, 'r': 0.0, 'f': 0.0},\n",
       "  'TIM': {'p': 91.83673469387756, 'r': 90.0, 'f': 90.9090909090909}},\n",
       " 'tags_acc': 0.0,\n",
       " 'token_acc': 100.0,\n",
       " 'textcat_score': 0.0,\n",
       " 'textcats_per_cat': {}}"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 評価\n",
    "固有表現評価(nlp, 評価データ)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'uas': 0.0,\n",
       " 'las': 0.0,\n",
       " 'las_per_type': {'': {'p': 0.0, 'r': 0.0, 'f': 0.0}},\n",
       " 'ents_p': 76.566757493188,\n",
       " 'ents_r': 56.882591093117405,\n",
       " 'ents_f': 65.27293844367014,\n",
       " 'ents_per_type': {'ART': {'p': 69.23076923076923,\n",
       "   'r': 15.0,\n",
       "   'f': 24.65753424657534},\n",
       "  'LOC': {'p': 70.76923076923077,\n",
       "   'r': 60.130718954248366,\n",
       "   'f': 65.01766784452296},\n",
       "  'DAT': {'p': 94.28571428571428,\n",
       "   'r': 92.5233644859813,\n",
       "   'f': 93.39622641509435},\n",
       "  'ORG': {'p': 57.14285714285714,\n",
       "   'r': 32.94117647058823,\n",
       "   'f': 41.791044776119406},\n",
       "  'PSN': {'p': 26.666666666666668,\n",
       "   'r': 30.76923076923077,\n",
       "   'f': 28.571428571428577},\n",
       "  'PNT': {'p': 80.0, 'r': 33.33333333333333, 'f': 47.05882352941176},\n",
       "  'MNY': {'p': 0.0, 'r': 0.0, 'f': 0.0},\n",
       "  'TIM': {'p': 91.83673469387756, 'r': 90.0, 'f': 90.9090909090909}},\n",
       " 'tags_acc': 0.0,\n",
       " 'token_acc': 100.0,\n",
       " 'textcat_score': 0.0,\n",
       " 'textcats_per_cat': {}}"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 評価\n",
    "固有表現評価(nlp_wa, 評価データ)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 抜き打ち検査"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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c03YdNNNw+WXX+7+fvHFF4fNNtssfOUrXwm/+tWv3HWkdpWCl4402ErBS6dr/fznPw/bbLNNeMc73hG++c1vuutI7akuXhrScCoFLx1puNQv/vSnP4XDDjssLLvssuGSSy4Jf/vb30Z/EVX4n//5n3DIIYeED3zgA51dN9vHkksumb03CFEZzyibpLrv8M3C8ou9Luy6xjLh+VO2d9eROlQHfPazn1W9JgoZKIN1/9/+Nqywww6Z8bntFVe46zTVQU88ET74+c9n+8Do7KVVP/axcMBjj7lppUgG62BpGHjmmWfCDiP3DeLvYeOrX/1q1ojx71Qh/8IqDb/q4qWRIoLUBKvzbV9dfeYzn3HTl5orBS+dJjr22GOz63zwwQeHX//61+46TfSzn/0sbL311mGxxRbL6vr873feeWdYf/31w1JLLZUZsfnfpW6UgpeONNhKwUunjv77v/97oXYElZmnMlj7q7p4aUjDqRS8dNrSpz/96cwsogNWvPyOO+4Is2fPDttuu224++67x/0mta9+8Pe//z1cdNFFWWzg85//fG1zleOkrGD+YQLWhaA6+ybIPlmRwdp/LJ41mctN3/CMsgSZuek9a9bRBTuu6aZfRTJYJ1glWFvAfZlXWZ1Vx2C1OH0+/VhxW1R2TKbUtkv0h4EyWLe59NLM+HzXVluFfR580F2niTBK1z/22PCK178+rHXQQZmh66338XvvDW/baKNsJO0eP/6xu06qZLAOlqpy8803ZyNnbrrpptElg0NbBqs9+KVo5513DvPnzx9NqV1ksEpTQXXx0kiRGayf/OQn3d97yYLkMli7UwpeOqn60Y9+lJmbiy66aLjiiivcdZrol7/8Zdh///3DK17xinDyyScvZOCW/f6DH/wgM1xOPfXUbBrjeDupuVLw0pEGWyl46dSR13bQDslgHRzVxUtDGk6l4KXThm677baw6qqrZuLv+DeeH/bcc8/s+YHnhPg3qX31A5713k+Mbo89wrPPPju6tDocZ95gffHFF7PPXxx33HHZ6NgyygzW2FRsW23GQew4h8Fg5VmAGB3XryoTEVuyffbTYKXzwaWXXhrOOuusyTXK2zPKEmTm5tHTVnB/76Vb9tlYButkVwnWFsT3pN2nbRusninq/eYdk1GWlhgcBsZgNVOTSqyJGAHrGad73n13ZtwustRSYcZFF2Uj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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "文章 = [nlp(テキスト) for テキスト, アノテーション in [評価データ[random.randint(0, len(評価データ))]]][0]\n",
    "spacy.displacy.render(文章, style='ent')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAB1AAAAB7CAYAAADKQRLbAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAHYcAAB2HAY/l8WUAAFvsSURBVHhe7b151C1Vea+bv+4Yd5gxbs45uXjPNTkeucYTczXRiCFBIxdphg1KNErogjTSKL00gthAAEERxQZBbEBBDL2CNBHsUYgIiihKI4oIbEQa2YoIat311F7vdlLMqlVVq9a31rf384zxjr2/WtXMmu0752/OWX9UiIiIiIiIiIiIiIiIiIhIiQKqiIiIiIiIiIiIiIiIiMgYBVQRERERERERERERERERkTEKqCIiIiIiIiIiIiIiIiIiYxRQRURERERERERERERERETGKKCKiIiIiIiIiIiIiIiIiIxRQBURERERERERERERERERGaOAKiIiIiIiIiIiIiIiIiIyRgFVRERERERERERERERERGTMVALqtx5+uDj9wQeLY+67rzj03nuLN/3855qmaWV9QL1A/UA9sSazcuXKYsWKFcVtt91W3HrrrcUPf/hDTSvzAnmCvEEeEREREREREREREZHlQy8B9eZHHine98ADWeFE0zStatQX1BtrEg899FBx++23Z8UzTasaeYU8IyIiIiIiIiIiIiKLT2cB9ZqHH84KJJqmaZOM+mNN4MEHH8yKZJo2ycg7IiIiIiIiIiIiIrLYdBJQWUGWE0U0TdPa2nJficoqwpwwpmltzZWoIiIiIiIiIiIiIotNJwHVbXs1TZvWqEeWM27bq01r5CERERERERERERERWVxaC6jfcuteTdMGMuqT5cjKlSuzgpimdTXykoiIiIiIiIiIiIgsJq0F1NMffDArhGiapnU16pPlyIoVK7JimKZ1NfKSiIiIiIiIiIiIiCwmrQXUY+67LyuEaJqmdTXqk+XIbbfdlhXDNK2rkZdEREREREREREREZDFpLaAeeu+9WSFE0zStq1GfLEduvfXWrBimaV2NvCQiIiIiIiIiIiIii0lrATUngmiapvW15UhOCNO0viYiIiIiIiIiIiIii4kCqqZpc7HlSE4E07S+JiIiIiIiIiIiIiKLiQKqpmlzseVITgTTtL4mIiIiIiIiIiIiIouJAqqmaXOx5UhOBNO0viYiIiIiIiIiIiIii4kCqqZpc7HlSE4E07S+JiIiIiIiIiIiIiKLiQKqpmlzseVITgTTtL4mIiIiIiIiIiIiIouJAqqmaXOx5UhOBNO0viYiIiIiIiIiIiIii4kCqqZpc7HlSE4E07S+JiIiIiIisrbw61//unjve99bXHDBBeMjIiIiIouNAqqmaXOx5UhOBBvarr322uIlL3lJ8Ud/9EfFk570pOKMM87IntfFbrrppmKfffYpXvjCFxb/8R//kT1HW3oTWSTuu+++4jWveU1p/F9kXtx5553FG9/4xuI73/nO+Mjayac//eniKU95SvHNb35zfGQVv/nNb4p3vOMdZXsevO9973tc2T3vvPOKj370o+X5Imsz3//+94tXvepVZbl56KGHxkdFZKn46le/WhxyyCHFz3/+8+L3v/998bGPfawsk7fffvv4jPbQh6KvTLvXFtpR2lPa1Wm49NJLix122KH4+te/Pj6yCv7ecccdi8suu2x8ZM3F/sKw/Pa3vy2OP/74Yueddy5uvvnm8dHhaVsGKJ/vf//7y3O322674u677x7/Mh1MnDj00EPLsttlHKTOF14U4r1y5eEnP/lJccABBxS33XZb+XeUnbTu+tWvflUcffTRj6tTqpAOu+22W/Gud72rfGaOprAsd4izurzT1Cb0zXdRXuraGY4vcr6U2aCAWmM7Xn558fQttii2Ouus4uAVK7Ln1NnW55xTPPGZzyyeu+uuxQE//nH2HG1p7AUHH1wKUS8/6aTs79r8bDlCoztLQ+g86KCDiic84QnFwaO8u8kmmxTPetazphY9v/SlL5X3ed7znldceeWV2XO0pbdFJxzHNvaMZzyj+MpXvjK+chU4rCeN6l7yH52xvvR1fIfggx/8YLHxxhsXV1xxxfjI8HSJ5yZ7xSteMVXH2wERmQU//elPi2233bbYc889awdKGTz61Kc+VQ4g8f8o8xj/X1upGzTCV6CcMjAT0JFPy+4DDzxQvP71ry8+97nPlX+LrK0wOIlwM20bCVE3Vdvfac0BOFnOII5uvvnmxeGHH1788pe/HB99LPjv+PG09fQJ7rrrrmKbbbYphdSufYS4V93Ado7wtSeJR9QXb3/724uLL764+N3vfjc+ugrE31122aUMN+EPmKTEu8+jnzIP5tFfYGLdW97ylpkIjPPu/+DL0T4NKVYCeT3Nk23LAL46kxsQdNMy2xWuoR+9xx57lPfs25+v84Wj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DxbH3Hdfcei992aFE03T1j6jPqBeoH6gnliTWblyZbFixYritttuK2699daseKatfUZeIE+QN8gjIiIiIiIiIiIiIrJ8mEpAFRERERERERERERERERFZk1BAFREREREREREREREREREZo4AqIiIiIiIiIiIiIiIiIjJGAVVEREREREREREREREREZIwCqoiIiIiIiIiIiIiIiIjIGAVUEREREREREREREREREZExCqgiIiIiIiIiIiIiIiIiImMUUEVERERERERERERERERExiigioiIiIiIiIiIiIiIiIiMUUAVERERERERERERERERERmjgCoiIiIiIiIiIiIiIiIiMkYBVURERERERERERERERERkjAKqiIiIiIiIiIiIiIiIiMgYBVQRERERERERERERERERkTEKqCIiIiIiIiIiIiIiIiIiYxRQRURERERERERERERERETGKKCKiIiIiIiIiIiIiIiIiIxRQBURERERERERERERERERGaOAKiIiIiIiIiIiIiIiIiIyRgFVRERERERERERERERERGSMAqqIiIiIiIiIiIiIiIiIyBgFVBERERERERERERERERGRMQqoIiIiIiIiIiIiIiIiIiJjFFBFRERERERERERERERERMYooErxzW9+s3jKU55SvO997xsfEREREREREREREREREVk7UUAVBVQRERERERERERERERGRMQsroN53333Fa17zmtL4/1Jz4YUXFs9//vOLs846a3xkeD796U+XwmUb23TTTYvvf//74ytXcf/99xfHHntscf3114+PPJZf//rXxaGHHpq93zRGuJcrEScveclLih/+8IfjoyIiIiIiIiIiIiIiIiKrUEDN8Nvf/rZ45zvfWTzjGc8oV2fOA8Lw/ve/vwzDGWecURxyyCHF/vvvX6xcubL8/ZZbbim23377UggkjL///e/L431YqhWoCL3rr7/+XFe6KqCKiIiIiIiIiIiIiIhIExMF1Msuu+xxKxC7GvfoyjwF1BUrVhRbb711sd122xV33333+OiwPProo8Upp5xSiqS/+tWvxkdX8bvf/a44//zzS/H0LW95S/k7q09ZhYr4eM455xQbb7xxsffeexd33nnn+Kr+LJWAGs8599xzx0eWHgVUERERERERERERERERaWLwFai/+c1vSoGMlYaIZTvvvHPxjW98Y/xrex566KHi4IMPnqmA2mUL3TqbJnysyHzVq15V7L777sVtt91WHmMl6Wc+85lSPH3FK15R3HzzzY87ztbCCKzEdXDvvfcWRx55ZHHTTTeNj7RnqQTUr371q+VzlnIL4Hi3PjYP8V5ERERERERERERERETmy6AC6u23316uikR84t8bbrih99aysVKQVaCIg0vFT37yk1K43GOPPYoHHnhgfHR2/PSnPy122mmnckXp5ZdfXpx55pmrRdKrrrpqfNYq2Nb3xBNPLH//0Ic+VP4NsZ0v11x66aWPifMhv4M67arNEKwRNedFrGx+wxveUPzyl78cHxURERERERERERERERFZxSACKkLeBRdcUAp4CIEXX3xxuQ3tNEzaapX7Iz6ed955xW677VY+f1p4jw9+8IPl6tmvf/3r46Oz55577ikF2xAqiccvfvGLWfGZ7XyPPfbY8rzjjz++FEyJcwTU733ve+OzurFUK1AXQUAlz7Dql62RH3744fFRERERERERERERERERkVUMtgKV7Vnf+c53DrZaFDGT+6UC6iOPPFJ8+9vfLo477rhSNMT4P8f4bVoQ9hAvEShjdeckEHLZfhfx8Ygjjnjc90zbwPVs4ztJPA1SERV761vfWtx///3jX7uzVAIq4vRGG21Ufs91XvBswjDrdxUREREREREREREREZHlyeDfQB0SRC7ErlNOOaXccvXZz352ub3uxz72sXIl4bSrXFNYBbrrrrsW2267bfGlL32pfDZbvfJMtsxlhWi6wvPnP/95ufp1yy23LEVPzud7pV3CxDdM+ZYp74gges4555RiZpttj7n21FNPLcNGGD/60Y/2Em9hqQRU7j/tNsDTUvcdVuKSVbwYaUq8hkCd2rzDLyIiIiIiIiIiIiIiIrNlIQVUBERWZb7+9a8vRSsErTPOOKP42c9+1kpc7AqrTWNFZ4ihN954Y7mNMLCq9pBDDinF23PPPbfYf//9S4Ft5513LleLxnltQfz8whe+UGyxxRblPa6//vryvWKL27b2ohe9qLjkkkuKAw88sAwP9+O+3B+63q+t9RURF0FARWgmrq699trxkVWQhnwfFePbt21XIIuIiIiIiIiIiIiIiMiaxcIJqLfffnspCK633nrlvwiZQ640rYJQduKJJ5ai2jve8Y7sFsSs7ER4QzwMgZVw9hVzWe160EEHleJniJ0psSK0ukqyaaUoK2IRmXfYYYfyujZxhpDJ90B5d7Yf3nTTTYuPfOQjMxGpYd4CKt885dunvDMrmEVERERERERERERERESqLIyAipDJFrZsR5uuypwlPPPMM88st9C96KKLHic6Im5ecMEF5UpPBF2ExkMPPbTzitOu9BFQu3LNNdeUYibv9PGPf7wUiQ8//PBiu+22K+6+++7xWX+AuDr99NPLdOkL4eb+fb+Ti/DK6l9W2fYR1VesWFFsvfXW5XbQv/zlL8dHRURERERERERERERERP7ARAH1rrvuKg477LDHfP9zaNJVoO9///tnLlAC4uhJJ51UbL755qWYWOWWW24phVzChPD3k5/8pPwm6nIXUFOhmndDQOYYfO1rXyuPVZ8b6cOz3/a2t/V+f8JNHLJNbh8uvfTSMgyEuQ/EH+/HamIRERERERERERERERGRHI0C6sqVK8sVf2xbe9VVV42PDg+rPBG2EOlCzJs1bA18wAEHFD/60Y/GR1bBqtcvfelLxcYbb1xu9fqd73ynPIbot9wFVLYdJj25B+/He6arfHkv3m+XXXYptwQG0oMVqqQP34G9//77y+N9mEZARfBmhSzbDN90003jo92I758SjyIiIiIiIiIiIiIiIiI5GgVUBDzEto997GMz2073gQceKHbffffHiHbzBKEYwXjXXXctV98GsxBQI36HsrqwxTdcWXU66dzvf//7pUj5qU99qnjooYeK448/vjyfVcjTbnuLgMoWumyl2xVEU8J11FFHZb8bOwnCzta9uS2Kb7755vIbsHfeeef4iIiIiIiIiIiIiIiIiKyt1AqosRrxFa94Rbl97azgu5Z8ixOhbtbfPJ1EiLm8M6JaylKuQP3gBz9YrpS89tprx0dW0XUFKiuIzz777HK1KaIw17HqlG+61r0HafCZz3ym/C7sVlttVYZjqG2VeT5pTZp3gVWwxx57bPkOrAjuA8Iw7/Tud7/7MaucEWMRZWedz0VERERERERERERERGR5UCughmB48MEHlysRZ0UIqOeee+74yPxAsEQw/OQnPzk+8geWSkANETe3UrKLgMp2vTvssEO57e3VV19dPPLII+XxiO+m92DF6lve8pbyWaxc/d3vfjf+ZTpIY0RMxMwuxKrgD33oQ722eEYU/shHPpLdvvenP/1puVUzK1AjjoYGkfass84qhWvCcOCBB5bpIyIiIiIiIiIiIiIiIotHrYAaW55i027d2gQiIWIhQl+frVmHJATK6rdHl5LPfe5zpciW2za5SUBF4N1pp51KwbOJNgIqhIjKyszrr79+fHQ6Yhtetgduu9qYlcCEgbAQpj5EHkOYRqBOifhou6q3Kwi+CL9sCX3HHXeUefzMM88sV/cqooqIiIiIiIiIiIiIiCwejd9AveCCC4r11luv3NJ1VtvrxpaxPOf8888fbLVjHxC4ELYOOeSQ3mLdNNx4442lWIjYds8994yP/oFJAiorZCcJgW0FVEA459unbAHM1r/T5gHExBNPPLGVKMuz2K6X1aGI+Pfee+/4l+5ceumlZbwhXFYh3mKl7iwE/EiXyy67bHzkD8+88MILx0dERERERERERERERERkUWgUUBG8EFE322yzYu+99y6FKL4TiQBUt90pohy/s3LwC1/4QnHCCSeUYtHll18+PuPx8JxzzjmnePazn10+5ytf+UopILbZKpdrWVXIM4cQPa+55ppSYNx5551L0ZBwTNraledO83ze4aKLLiqFyj322KO46667xr88liYB9cc//nHxspe9bBABlfeId0ZU/MQnPlGsv/76xcknnzx1HHP9cccdV97vve99bxnuNH75nS2H999//2LDDTcsTj/99KmEzdgSeZtttqmNV7YIZmvht7/97WV46t4x8tqDDz7YWkwmXyigioiIiIiIiIiIiIiILB8aBdQAQenKK68sxdDddtut2HLLLcttZhHzqsZxfmc72Xe9612l6MpWpYhPk1i5cmUpJLJd6/bbb19svvnm2WdUjfM4/9RTTx3faToQFnnf448/vnyPpvfF+D4nW8R2fT5iHKtvuT/3YPvdJoEyxE++S4sIFxBevttKWOq2Hw7x77rrriu/xUk6kjaIoqQT7/nKV76yvAf/pitEEQv5G1F5iy22KK644oqpVgpzP97lpJNOKsVFhPOIS55N+iO+kx+mgeewqpn7Tto2mNXHhId4aMp3hA8B+OGHHx5f2Qzx7ha+IiIiIiIiIiIiIiIiy4dWAqoMD6In2+MecMAB5Yrbtqttzz777GLbbbd9nKCL6Fe3QhRxldWtiMwIp6xSZStdBFSEYlYLI8hOCgPi3yWXXFKunvzGN74xPrq4hPB75JFHluLxvCDezjrrrFK4Jt0OPPBAxVMREREREREREREREZEFRQFVRERERERERERERERERGSMAqqIiIiIiIiIiIiIiIiIyBgFVBERERERERERERERERGRMQqoIiIiIiIiIiIiIiIiIiJjFFBFRERERERERERERERERMYooIqIiIiIiIiIiIiIiIiIjFFAFREREREREREREREREREZo4AqIiIiIiIiIiIiIiIiIjJGAVVEREREREREREREREREZIwCqoiIiIiIiIiIiIiIiIjIGAVUEREREREREREREREREZExCqgiIiIiIiIiIiIiIiIiIiVF8f8D+PlXPbn+eRoAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "文章 = [nlp(テキスト) for テキスト, アノテーション in [評価データ[random.randint(0, len(評価データ))]]][0]\n",
    "spacy.displacy.render(文章, style='ent')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## トランスフォーマーモデルの使用  \n",
    "`spacy-transformers`パッケージはspaCyのパイプラインにHugging Faceの[transformersパッケージ](https://github.com/huggingface/transformers) に含まれる最先端のトランスフォーマーアーキテキチャに基づくモデル（[BERT](https://arxiv.org/abs/1810.04805)、[GPT-2](https://d4mucfpksywv.cloudfront.net/better-language-models/language_models_are_unsupervised_multitask_learners.pdf)、[XLNet](https://arxiv.org/abs/1906.08237)など）の便利な機能を追加します。こういった学習済みモデルは大量の文章を言語モデルで学習させています。  \n",
    "\n",
    "このチュートリアルでは日本語BERTを使っていきます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "# !pip install spacy-transformers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "# # 日本語BERTモデルをダウンロード、解凍、ファイル名を変更（ファイル名がbertで始まらないとspaCyでエラーが発生する）\n",
    "# !wget https://www.nlp.ecei.tohoku.ac.jp/~m-suzuki/bert-japanese/BERT-base_mecab-ipadic-bpe-32k_whole-word-mask.tar.xz -P model\n",
    "# !tar xf data/BERT-base_mecab-ipadic-bpe-32k_whole-word-mask.tar.xz -C model\n",
    "# !mv model/BERT-base_mecab-ipadic-bpe-32k_whole-word-mask model/bert_ja"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "# # MeCabをインストールする（トークン化に必要）\n",
    "# !apt-get install -y mecab mecab-ipadic-utf8 libmecab-dev\n",
    "# !pip install mecab-python3\n",
    "# # インストール後にカーネルを再起動します"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import spacy\n",
    "from spacy.gold import GoldParse\n",
    "from spacy.scorer import Scorer\n",
    "from spacy.util import decaying, minibatch, compounding\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import random\n",
    "from sklearn.metrics import precision_score, recall_score, confusion_matrix, accuracy_score, f1_score, roc_auc_score, roc_curve\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "import scikitplot.plotters as skplt\n",
    "\n",
    "# 最初のGPUカードを使用する\n",
    "spacy.prefer_gpu()\n",
    "spacy.util.use_gpu(0)\n",
    "\n",
    "import torch\n",
    "from spacy_transformers import TransformersLanguage, TransformersWordPiecer, TransformersTok2Vec\n",
    "\n",
    "# モデルを読み込む\n",
    "name = \"bert_ja\"\n",
    "path = \"model/bert_ja\"\n",
    "\n",
    "nlp = TransformersLanguage(trf_name=name, meta={\"lang\": \"ja\"})\n",
    "nlp.add_pipe(nlp.create_pipe(\"sentencizer\"))\n",
    "nlp.add_pipe(TransformersWordPiecer.from_pretrained(nlp.vocab, path))\n",
    "nlp.add_pipe(TransformersTok2Vec.from_pretrained(nlp.vocab, path))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# CUDAテンソルを使用する\n",
    "if spacy.prefer_gpu():\n",
    "    torch.set_default_tensor_type(\"torch.cuda.FloatTensor\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['sentencizer', 'trf_wordpiecer', 'trf_tok2vec']\n"
     ]
    }
   ],
   "source": [
    "# パイプラインが通常のspaCyと違う\n",
    "print(nlp.pipe_names)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 類似度の確認  \n",
    "通常の単語ベクトルと違いBERTのような言語モデルベースの単語ベクトルは文脈を考慮したものを出力します。この機能はspaCyの既存のsimilarityメソッドに追加されます。  \n",
    "\n",
    "同じ様に自分でTensorFlow等の他の機械学習フレームワークで学習したモデル(例えば自然言語推論(NLI))をsimilarityメソッドに追加する事も可能です。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.8145274\n",
      "0.8711613\n"
     ]
    }
   ],
   "source": [
    "リンゴ1 = nlp(\"アップル株最高値、5G iPhone発売\")\n",
    "リンゴ2 = nlp(\"アップルパイとは、砂糖煮にしたリンゴを詰めてオーブンで焼いたパイのこと。\")\n",
    "リンゴ3 = nlp(\"アップルとさつまいもケーキの簡単おいしいレシピ\")\n",
    "print(リンゴ1[0].similarity(リンゴ2[0]))  # 会社名と食べ物\n",
    "print(リンゴ2[0].similarity(リンゴ3[0]))  # 両方とも食べ物"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(0.81524175, dtype=float32)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 文章の類似度\n",
    "リンゴ1.similarity(リンゴ3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(0.8737486, dtype=float32)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 文章の類似度\n",
    "リンゴ2.similarity(リンゴ3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((16, 768), (28, 768), (18, 768))"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# (wordpiecesトークン数、次元数)\n",
    "# [CLS]の埋め込みはtrf_last_hidden_state[0]です\n",
    "リンゴ1._.trf_last_hidden_state.shape, リンゴ2._.trf_last_hidden_state.shape, リンゴ3._.trf_last_hidden_state.shape,"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['[CLS]', 'アッ', '##フル', '株', '最', '高', '値', '、', '5', '##g', 'i', '##ph', '##one', '発', '売', '[SEP]']\n"
     ]
    }
   ],
   "source": [
    "# wordpiecesをプリントする\n",
    "print(リンゴ1._.trf_word_pieces_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 転移学習  \n",
    "学習済みトランスフォーマーモデルは転移学習にも利用できます。コンピュータービジョン系の学習済みモデル(ResNetやInception等)の転移学習と同様、自分独自のデータセットとラベルに対してモデル学習ができます。`nlp.update`で学習済みモデルの重みも更新するファインチューニングも可能です。  \n",
    "\n",
    "転移学習はspaCyの決められたパイプラインにしか対応していません。例え`spacy-transformers`, は`trf_textcat`を使います。文章読解などの全く関係のないタスクには対応していません。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "from spacy.util import minibatch\n",
    "import spacy_transformers\n",
    "from spacy_transformers.util import cyclic_triangular_rate\n",
    "from sklearn.model_selection import train_test_split"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1970, 2)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "学習行列 = pd.read_csv('data/train.tsv.bz2', sep='\\t', compression='bz2', names=['テキスト', 'ラベル'])\n",
    "学習行列.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(843, 2)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "評価行列 = pd.read_csv('data/test.tsv.bz2', sep='\\t', compression='bz2', names=['テキスト', 'ラベル'])\n",
    "評価行列.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 若干不均衡データ\n",
    "学習行列.ラベル.value_counts().plot(kind=\"bar\");"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 特徴量とラベルに分ける\n",
    "学習X = 学習行列[['テキスト']]\n",
    "学習y = 学習行列.ラベル\n",
    "評価X = 評価行列[['テキスト']]\n",
    "評価y = 評価行列.ラベル"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((1970, 1), (843, 1))"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "学習X.shape, 評価X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "def データ前処理(データX:pd.DataFrame=None, データy:np.array=None, テキストコラム名:str='テキスト'):\n",
    "    ラベル = [{\"1\": bool(y), \"0\": not bool(y)} for y in データy]\n",
    "    テキスト = tuple(データX[テキストコラム名].values.tolist())\n",
    "    結合データ = list(zip(テキスト, [{\"cats\": カテゴリー} for カテゴリー in ラベル]))\n",
    "    \n",
    "    return 結合データ, テキスト, ラベル"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "パッディングは最小限に抑える為、バッチごとに系列長の長さに合わせて自動的にグループ分けされます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "# spaCy用にデータを前処理する\n",
    "学習データ, 学習テキスト, 学習ラベル = データ前処理(学習X, 学習y, \"テキスト\")\n",
    "評価データ, 評価テキスト, 評価ラベル = データ前処理(評価X, 評価y, \"テキスト\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 文章分類用のパイプラインを作成する\n",
    "文書分類パイプ = nlp.create_pipe(\"trf_textcat\", config={\"exclusive_classes\": True, \"architecture\": \"softmax_class_vector\"})\n",
    "for ラベル in (\"1\", \"0\"):\n",
    "    文書分類パイプ.add_label(ラベル)\n",
    "nlp.add_pipe(文書分類パイプ, last=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 評価関数\n",
    "def 文章分類評価(nlp:spacy_transformers.language.TransformersLanguage=None, \n",
    "                評価テキスト:tuple=None, \n",
    "                評価ラベル:list=None, \n",
    "                バッチ数:int=32):\n",
    "    確率リスト = []\n",
    "    ラベルリスト = []\n",
    "    \n",
    "    for i, 文章 in enumerate(nlp.pipe(評価テキスト, batch_size=バッチ数)):\n",
    "        予測 = 文章.cats['1']\n",
    "        ラベル = 1.0 if 評価ラベル[i]['1'] else 0.0\n",
    "        確率リスト.append(予測)\n",
    "        ラベルリスト.append(ラベル)\n",
    "    \n",
    "    予測インデックス = np.round(確率リスト)\n",
    "    正解率 = accuracy_score(ラベルリスト, 予測インデックス)\n",
    "    roc_auc = roc_auc_score(ラベルリスト, 確率リスト)\n",
    "    f値 = f1_score(ラベルリスト, 予測インデックス)\n",
    "    適合率 = precision_score(ラベルリスト, 予測インデックス)\n",
    "    再現率 = recall_score(ラベルリスト, 予測インデックス)\n",
    "    \n",
    "    return {'正解率': 正解率, 'roc_auc': roc_auc, 'f値': f値, '適合率': 適合率, '再現率': 再現率}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Optimizer (Adam)\n",
    "最適化法 = nlp.resume_training()\n",
    "最適化法.alpha = 0.001\n",
    "最適化法.trf_weight_decay = 0.005\n",
    "最適化法.L2 = 0.0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "def 文章分類学習(エポック数:int=5,\n",
    "               学習データ:list=None,\n",
    "               評価テキスト:tuple=None,\n",
    "               評価ラベル:list=None, \n",
    "               バッチ数:int=32, \n",
    "               学習率:float=1e-3):\n",
    "    学習状況 = []\n",
    "    ドロップアウト = decaying(0.2, 0.1, 0.3) # ドロップアウトを0.2から0.1に徐々に減少させる\n",
    "    # Cyclic triangular rate (https://arxiv.org/abs/1506.01186)\n",
    "    上昇下降学習率 = cyclic_triangular_rate(\n",
    "        学習率 / 3, 学習率 * 3, 2 * len(学習データ) // バッチ数\n",
    "    )\n",
    "\n",
    "    for エポック in range(エポック数):\n",
    "        random.shuffle(学習データ)\n",
    "        全バッチ = minibatch(学習データ, size=バッチ数)\n",
    "        損失 = {}\n",
    "\n",
    "        for バッチ in 全バッチ:\n",
    "            最適化法.trf_lr = next(上昇下降学習率)\n",
    "            テキスト, ラベル = zip(*バッチ)\n",
    "            nlp.update(\n",
    "                テキスト, \n",
    "                ラベル, \n",
    "                drop = next(ドロップアウト),\n",
    "                sgd = 最適化法,\n",
    "                losses=損失)\n",
    "\n",
    "        print(f\"エポック: {エポック+1}\")\n",
    "        print(f\"損失: {損失}\")\n",
    "        \n",
    "        with nlp.use_params(最適化法.averages):\n",
    "            評価スコア = 文章分類評価(nlp, 評価テキスト, 評価ラベル, バッチ数)\n",
    "\n",
    "        print(評価スコア)\n",
    "\n",
    "        学習状況.append(損失)\n",
    "        学習状況.append(評価スコア)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "エポック: 1\n",
      "損失: {'trf_textcat': 0.028460620407713577}\n",
      "{'正解率': 0.6725978647686833, 'roc_auc': 0.7293191394987801, 'f値': 0.757469244288225, '適合率': 0.6766091051805337, '再現率': 0.8602794411177644}\n",
      "エポック: 2\n",
      "損失: {'trf_textcat': 0.025759468393516727}\n",
      "{'正解率': 0.66429418742586, 'roc_auc': 0.7694085513184158, 'f値': 0.7704785077047851, '適合率': 0.6489071038251366, '再現率': 0.9481037924151696}\n",
      "エポック: 3\n",
      "損失: {'trf_textcat': 0.024284954386530444}\n",
      "{'正解率': 0.7093712930011863, 'roc_auc': 0.7808359888410314, 'f値': 0.7886108714408975, '適合率': 0.6945288753799392, '再現率': 0.9121756487025948}\n",
      "エポック: 4\n",
      "損失: {'trf_textcat': 0.022368382633430883}\n",
      "{'正解率': 0.741399762752076, 'roc_auc': 0.7884231536926147, 'f値': 0.8114186851211073, '適合率': 0.716030534351145, '再現率': 0.936127744510978}\n",
      "エポック: 5\n",
      "損失: {'trf_textcat': 0.021247176511678845}\n",
      "{'正解率': 0.7568208778173191, 'roc_auc': 0.8059436682191172, 'f値': 0.8184233835252435, '適合率': 0.7356687898089171, '再現率': 0.9221556886227545}\n",
      "エポック: 6\n",
      "損失: {'trf_textcat': 0.019620090431999415}\n",
      "{'正解率': 0.763938315539739, 'roc_auc': 0.8003933653161514, 'f値': 0.8208820882088208, '適合率': 0.7475409836065574, '再現率': 0.9101796407185628}\n",
      "エポック: 7\n",
      "損失: {'trf_textcat': 0.019623343949206173}\n",
      "{'正解率': 0.7615658362989324, 'roc_auc': 0.8018290903572971, 'f値': 0.8213333333333335, '適合率': 0.7403846153846154, '再現率': 0.9221556886227545}\n",
      "エポック: 8\n",
      "損失: {'trf_textcat': 0.01802219109958969}\n",
      "{'正解率': 0.7686832740213523, 'roc_auc': 0.8214448296389677, 'f値': 0.8251121076233183, '適合率': 0.749185667752443, '再現率': 0.9181636726546906}\n",
      "エポック: 9\n",
      "損失: {'trf_textcat': 0.017261488785152324}\n",
      "{'正解率': 0.7758007117437722, 'roc_auc': 0.8279639551306743, 'f値': 0.8286491387126019, '適合率': 0.7591362126245847, '再現率': 0.9121756487025948}\n",
      "エポック: 10\n",
      "損失: {'trf_textcat': 0.018943645598483272}\n",
      "{'正解率': 0.7722419928825622, 'roc_auc': 0.8315824491368141, 'f値': 0.826086956521739, '適合率': 0.7562189054726368, '再現率': 0.9101796407185628}\n",
      "エポック: 11\n",
      "損失: {'trf_textcat': 0.019012881952221505}\n",
      "{'正解率': 0.7781731909845789, 'roc_auc': 0.8430215592207397, 'f値': 0.8310749774164409, '適合率': 0.759075907590759, '再現率': 0.9181636726546906}\n",
      "エポック: 12\n",
      "損失: {'trf_textcat': 0.017682607620372437}\n",
      "{'正解率': 0.7781731909845789, 'roc_auc': 0.8450467486080471, 'f値': 0.831379621280433, '適合率': 0.7582236842105263, '再現率': 0.9201596806387226}\n",
      "エポック: 13\n",
      "損失: {'trf_textcat': 0.016478488425491378}\n",
      "{'正解率': 0.7841043890865955, 'roc_auc': 0.8502935649169499, 'f値': 0.8348457350272231, '適合率': 0.7653910149750416, '再現率': 0.9181636726546906}\n",
      "エポック: 14\n",
      "損失: {'trf_textcat': 0.015318336823838763}\n",
      "{'正解率': 0.7935943060498221, 'roc_auc': 0.8555462175065074, 'f値': 0.8397790055248618, '適合率': 0.7794871794871795, '再現率': 0.9101796407185628}\n",
      "エポック: 15\n",
      "損失: {'trf_textcat': 0.016067369884694926}\n",
      "{'正解率': 0.7852906287069988, 'roc_auc': 0.8590071319349605, 'f値': 0.8356039963669393, '適合率': 0.7666666666666667, '再現率': 0.9181636726546906}\n",
      "エポック: 16\n",
      "損失: {'trf_textcat': 0.014346320436743554}\n",
      "{'正解率': 0.7947805456702254, 'roc_auc': 0.8684210526315789, 'f値': 0.840846366145354, '適合率': 0.7798634812286689, '再現率': 0.9121756487025948}\n",
      "エポック: 17\n",
      "損失: {'trf_textcat': 0.013821623637340963}\n",
      "{'正解率': 0.8066429418742586, 'roc_auc': 0.8733585460657632, 'f値': 0.8486536675951718, '適合率': 0.7934027777777778, '再現率': 0.9121756487025948}\n",
      "エポック: 18\n",
      "損失: {'trf_textcat': 0.015274372417479753}\n",
      "{'正解率': 0.7995255041518387, 'roc_auc': 0.8748409613521495, 'f値': 0.8427906976744186, '適合率': 0.789198606271777, '再現率': 0.9041916167664671}\n",
      "エポック: 19\n",
      "損失: {'trf_textcat': 0.015746990393381566}\n",
      "{'正解率': 0.8030842230130486, 'roc_auc': 0.8753545540497951, 'f値': 0.8445692883895132, '適合率': 0.7954144620811288, '再現率': 0.9001996007984032}\n",
      "エポック: 20\n",
      "損失: {'trf_textcat': 0.014503161204629578}\n",
      "{'正解率': 0.8030842230130486, 'roc_auc': 0.8768836595814219, 'f値': 0.8442776735459662, '適合率': 0.7964601769911505, '再現率': 0.8982035928143712}\n"
     ]
    }
   ],
   "source": [
    "文章分類学習(エポック数=20, 学習データ=学習データ, 評価テキスト=評価テキスト, 評価ラベル=評価ラベル, バッチ数=32, 学習率=1e-6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'正解率': 0.8078291814946619,\n",
       " 'roc_auc': 0.8823230731519418,\n",
       " 'f値': 0.8451242829827916,\n",
       " '適合率': 0.8110091743119267,\n",
       " '再現率': 0.8822355289421158}"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 評価\n",
    "文章分類評価(nlp, 評価テキスト, 評価ラベル, 32)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 重みを平均する (https://www.aclweb.org/anthology/P04-1015/)\n",
    "with nlp.use_params(最適化法.averages):\n",
    "    nlp.to_disk('model/ja_bert_textcat_wa')\n",
    "    \n",
    "nlp_wa = nlp.from_disk('model/ja_bert_textcat_wa')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'正解率': 0.8030842230130486,\n",
       " 'roc_auc': 0.8768836595814219,\n",
       " 'f値': 0.8442776735459662,\n",
       " '適合率': 0.7964601769911505,\n",
       " '再現率': 0.8982035928143712}"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 評価\n",
    "文章分類評価(nlp_wa, 評価テキスト, 評価ラベル, 32)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 予測関数\n",
    "def 予測(nlp:spacy_transformers.language.TransformersLanguage=None, \n",
    "       評価テキスト:tuple=None, \n",
    "       バッチ数:int=32):\n",
    "    \n",
    "    確率リスト = []\n",
    "    \n",
    "    for i, 文章 in enumerate(nlp.pipe(評価テキスト, batch_size=バッチ数)):\n",
    "        予測 = 文章.cats['1']\n",
    "        確率リスト.append(予測)\n",
    "    \n",
    "    return 確率リスト"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "確率 = 予測(nlp, 評価テキスト)\n",
    "予測インデックス = np.round(確率)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "skplt.plot_confusion_matrix(評価y, 予測インデックス, figsize=(5,5), normalize=True);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "skplt.plot_confusion_matrix(評価y, 予測インデックス, figsize=(5,5), normalize=False);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 最適な適合率、再現率、f値を計算する\n",
    "def 適合再現f1計算(評価y:np.ndarray=None, 確率:list=None):\n",
    "    閾値リスト = []\n",
    "    閾値 = []\n",
    "    for 閾 in np.arange(0.01, 1.0, 0.01):\n",
    "        閾 = np.round(閾, 2)\n",
    "        再現率 = recall_score(評価y, (確率 > 閾).astype(int))\n",
    "        適合率 = precision_score(評価y, (確率 > 閾).astype(int))\n",
    "        f値 = f1_score(評価y, (確率 > 閾).astype(int))\n",
    "        閾値リスト.append([閾, 再現率, 適合率, f値])\n",
    "        閾値.append([閾, 再現率, 適合率, f値])\n",
    "\n",
    "    # f値で並び替え（降順）\n",
    "    閾値.sort(key=lambda x: x[3], reverse=True)\n",
    "    最高閾値 = 閾値[0][0]\n",
    "    最高再現率 = 閾値[0][1]\n",
    "    最高適合率 = 閾値[0][2]\n",
    "    最高f値 = 閾値[0][3]\n",
    "    return  閾値リスト, 最高再現率, 最高適合率, 最高f値, 最高閾値"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "最適再現率: 0.8642714570858283 最適適合率: 0.8359073359073359 最適f値: 0.8498527968596663 閾値: 0.61\n"
     ]
    }
   ],
   "source": [
    "閾値リスト, 最高再現率, 最高適合率, 最高f値, 最高閾値 = 適合再現f1計算(評価y, 確率)\n",
    "print(f'最適再現率: {最高再現率} 最適適合率: {最高適合率} 最適f値: {最高f値} 閾値: {最高閾値}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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v5zkWOUkx36zTjg3PlfbD29XU2uTw5V9G0HYR4YMGXLG6+PHj1dtba2PqgEAAPCeEfmp+mLzPh1palGPhB5qs23aemir02V9C0H4PJzPiXELFiw44/UZM2YoISHhfEsCAADwGyPzU3W0tU2fl+9VbnyuJPnlwRoE4ZNUVlYqPz9ft912m/r27atrr71W9fX1ys7O1iOPPKJLLrlEb775pjZv3qxx48appKREw4YN0/r16yVJ1dXV+s53vqN+/fqpX79+3wTgjh07SpJ27dqlSy+9VP3791dRUZHmzZsnScrOztbevXslSb/73e9UVFSkoqIiPfHEE9/UVVBQoLvvvluFhYUaM2aMGhoafP3bAwAAcFal2Z0VFxWu2etrlB2fLZdx+eUWauFOF3BaHz4k7f7Ks32m95Gu+O+zNtuwYYNeeOEFDR06VHfccYeeeeYZSVJ0dLTmz58vSRo5cqSee+459erVS4sWLdK9996r2bNn60c/+pEuu+wyvfPOO2ptbVVdXd0JfU+dOlVjx47Vww8/rNbWVtXX159wfenSpXrxxRe1aNEiWWtVVlamyy67TImJidq0aZNee+01/fGPf9T111+vt99+W7fccouHfnMAAAA8IzLcpUvzUjR7fY3+y9VHXTt29cst1Pw3CDuoW7duGjp0qCTplltu0VNPPSVJuuGGGyRJdXV1WrBgga677rpvPtPU1L4AfPbs2frzn/8sSQoLC1N8fPwJfQ8YMEB33HGHmpubNWnSJPXv3/+E6/Pnz9d3vvMdxcbGSpImT56sefPmacKECcrJyfmmfUlJiSorKz38KwcAAPCMEfmp+uCrXVqz85By43OZET4nbszceosx5pSvvw6nbW1tSkhI0IoVK86570svvVSfffaZPvjgA333u9/Vgw8+qFtvvfWb69ba0342Kirqm6/DwsJYGgEAAPzW5RelyBjpk3U1yk3M1fyd89XS1qJwl//ET9YIn8K2bdv0xRdfSJJee+01XXLJJSdc79Spk3JycvTmm29Kag+vK1eulNS+ZOLZZ5+V1P5Q3aFDh0747NatW5Wamqq7775bd955p5YtW3bC9UsvvVTvvvuu6uvrdeTIEb3zzjsaNmyYV36dAAAA3pLUMUr9uyVo9vpqTew5Uc+Nes7pkr6FIHwKBQUFevnll9W3b1/t379f//AP//CtNq+++qpe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\n",
      "text/plain": [
       "<Figure size 864x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "閾値リスト = np.array(閾値リスト)\n",
    "閾値 = 閾値リスト[:,0]\n",
    "再現率リスト = 閾値リスト[:,1]\n",
    "適合率リスト = 閾値リスト[:,2]\n",
    "f値リスト = 閾値リスト[:,3]\n",
    "\n",
    "plt.figure(figsize = (12, 8))\n",
    "plt.plot(閾値, 再現率リスト, label='recall')\n",
    "plt.plot(閾値, 適合率リスト, label='precision')\n",
    "plt.plot(閾値, f値リスト, label='f1')\n",
    "plt.title('Recall, Precision, F1')\n",
    "plt.xlabel('閾値')\n",
    "plt.legend()\n",
    "plt.show();"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# ROC曲線\n",
    "fp, tp, thresholds = roc_curve(評価y, 確率)\n",
    "\n",
    "plt.figure(figsize = (8, 6))\n",
    "plt.plot(fp, tp)\n",
    "plt.title(\"ROC curve\")\n",
    "plt.xlabel( \"False Positive Rate\")\n",
    "plt.ylabel(\"True Positive Rate\")\n",
    "plt.show();"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 予測と正解ラベルの分布比較\n",
    "評価行列 = pd.DataFrame(予測インデックス, columns=['予測'])\n",
    "評価行列['確率'] = 確率\n",
    "\n",
    "ラベルリスト = []\n",
    "\n",
    "for i in 評価ラベル:\n",
    "    ラベル = 1.0 if i['1'] else 0.0\n",
    "    ラベルリスト.append(ラベル)\n",
    "    \n",
    "評価行列['ラベル'] = ラベルリスト"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWoAAAEGCAYAAABM7t/CAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAdHklEQVR4nO3deXhU1eH/8fcJCQHZkhAqyBaMIrg8NYCioBSDCmiLglGWIiAoWkWhUH0UpIQ++KDy0BoXahERsCnozwVXyqIxogKylcUvBakgtVZESQDrQwjh/P7IZJyQGXJDMpkzk8/reeZhcu+Ze8893Hxyc+65J8Zai4iIuCsu0hUQEZFTU1CLiDhOQS0i4jgFtYiI4xTUIiKOiw/HRlNTU21aWlo4Ni0iEpM2btz4nbW2RbB1YQnqtLQ0NmzYEI5Ni4jEJGPMl6HWqetDRMRxCmoREccpqEVEHKegFhFxnIJaRMRxCmoREccpqEVEHKegFhFxXFgeeJHwKSoq4uDBgxw5coSSkpJIV0fqiHr16tGkSRNSUlJITEyMdHXqHAV1FCkqKmLfvn0kJyeTlpZGQkICxphIV0tinLWW4uJiDh8+zL59+2jXrl2dD+u5c396P3Zs+Penro8ocvDgQZKTk0lNTaV+/foKaakVxhjq169PamoqycnJHDx4MNJVqnMU1FHkyJEjNG3aNNLVkDqsadOmHDlyJNLVqHMU1FGkpKSEhISESFdD6rCEhATdG4kABXWUUXeHRJLOv8hQUIuIOE5BLSLiOAW1iIjjNI46hgSO7XRRbYw3rU3Z2dlMnz6dvLw8evfu7ekze/fupUOHDowcOZIFCxaEtX5yemp7jLQXuqKWqGOMKfeqV68eqampZGZmkpubG+nqYYzxHNwiXuiKWqLWtGnTACguLmbnzp0sXbqUvLw8Nm7cyB//+Mew73/cuHEMGTKEdu3aef5M69at2bFjB82aNQtjzSTWKKglamVnZ5f7+r333uOaa67hiSee4L777iMtLS2s+09NTSU1NbVKn0lISKBTp05hqpHEKnV9SMzo06cPnTp1wlrL+vXry617+eWX6dWrF82aNaNhw4ZcdNFFzJw5k6Kiogrb2bp1K0OHDiUtLY3ExERatGhBly5dmDBhAsXFxf5y2dnZGGP44IMPAFiwYIF/nHF+fn657pmyHyp79+7FGMOoUaP82+nbty/GGLZs2RL0uJYsWYIxhvvvv7/c8oMHD/LQQw/RuXNnGjZsSLNmzejTpw8rVqyoatOJ4xTUElOstUD5BzMmT57M4MGD2bFjB8OGDWPcuHFYa5k8eTJ9+/YtF75bt26le/fuvPHGG1x22WVMnDiRW265hRYtWjBnzpygwV7m4osv9nfHtG/fnmnTpvlfp+qzLgvtRYsWBV1ftnzkyJH+ZV9++SVdu3bl0UcfpUWLFtx1113+Y+zXrx/PPffcqRtKooq6PiRmrFq1ip07d2KM4ZJLLgFgzZo1zJw5k7Zt2/Lpp5/SsmVLAGbOnMnAgQN5++23mTVrFpMnTwZg4cKFHD16lKVLl3LDDTeU235BQQFnnHFGyP1ffPHFXHzxxUyfPp20tLQKXTOhDBw4kGbNmpGbm8tjjz1GfPxP35bffPMNK1asoEuXLlx44YX+5SNHjuTLL79k8eLFDBkyxL+8sLCQ3r17c9999zFgwADOPPNMT3UQt+mKWqJWdnY22dnZTJkyhaysLPr164e1lgkTJtC+fXsA5s+fD8DDDz/sD2mA+Ph4Zs+eTVxcHPPmzauw7YYNG1ZYlpycTFxczX/LNGjQgFtuuYX9+/ezfPnycuv++te/UlJSUu5qesuWLeTn53PTTTeVC2mApKQkpk+fztGjR3n11VdrvK4SGbqilqg1ffp0oLSbIykpiSuvvJIxY8YwfPhwf5lNmzYBkJmZWeHzHTt2pE2bNuzZs4fCwkKSkpIYPHgwOTk53HjjjWRlZXH11VfTs2dP0tPTw3oso0aN4rnnnmPhwoVcf/31/uULFy4kISGBYcOG+ZetWbMGgEOHDgW9aj9w4AAAO3bsCGudpfYoqCVqlfVHn8qhQ4cAaNWqVdD1rVq1Yt++fRw6dIikpCQuvfRSVq9ezSOPPMIrr7zCiy++CMB5553HtGnTGDp0aM0dQIAePXrQsWNH3nzzTQoKCkhOTmbTpk1s376dG2+8sdzoku+//x6AlStXsnLlypDb/OGHH8JSV6l96vqQmFY2Xvmbb74Juv6///1vuXIAl19+OW+//TYFBQV8/PHHTJ06lf379zNs2DBWrVoVtrqOGDGCoqIiXnrpJaD0ahrK30QMrGtOTg7W2pCvF154IWx1ldqloJaYlpGRAeAfQhdo9+7dfPXVV3To0IGkpKQK6xMTE+nRowd/+MMfePLJJwF44403Kt1nXFzcac3ZPGLECOLi4li4cCHFxcUsXryY1NTUcl0hAJdddhkAq1evrvI+JDopqCWmjR49GoAZM2b4+26h9I8w/O53v+PEiROMGTPGv3z16tX+7pJA+/fvBzjlqI8yzZs359///neV69q2bVsyMzNZu3YtOTk5HDhwgGHDhlX4YxHdunXjyiuv5LXXXvPfLD3Ztm3b+Pbbb6tcB3GT+qglpvXo0YMHHniAxx9/nAsvvJCsrCwaNWrEsmXL2L59O1dccUW5B0lmz57NihUr6N27N2effTaNGzfms88+Y9myZSQnJzPWwyw9ffr0YcmSJfzqV7+ia9euxMfH06tXL3r16lXpZ0eOHMmqVav8wwVP7vYo87e//Y3MzEzGjBnDk08+Sffu3UlKSuKrr75i69atbN++nTVr1vCzn/3MY0uJyxTUMcSVmb5c89hjj5GRkcHTTz/NokWLKC4uJj09nRkzZjBp0iTq16/vL3v33XeTnJzMunXr+Pjjjzl+/Dht2rTh7rvvZtKkSf5hf6eSk5ODMYb33nuPd999lxMnTjBt2jRPQT1o0CDuueceDh8+zIUXXkiXLl2ClmvTpg0bN27kqaee4tVXXyU3N5eSkhJatmzJ+eefz7333stFF13kvZHEacbLnfOq6tatm92wYUONb7eu27FjB507d450NaSOi/Xz0Ms0p+GYCtUYs9Fa2y3YOl1Ri0id4eJc017oZqKIiOMU1CIijlNQi4g4TkEtIuI4BbWIiOMU1CIijlNQi4g4TkEtIuI4BbWIiOMU1CIijlNQi4g4TkEtIuI4TcoUS3bPrbxMJJ0TRbPgOKR3797k5+d7+huREpt0RS1RxxiDMYb27dtz9OjRoGXS0tIwxnD8+PFarl3VjRo1CmMMe/fujXRVxFEKaola+/bt44knnoh0NcJu0aJF7NixI9LVkAhS14dEpeTkZIwxzJw5k9tvv53U1NRIVyls2rVrF+kqRLW51egRdGX+al1RS1Q644wzmDp1KocPH2b69OlV+uy6devIysqiZcuW1K9fn7Zt23LnnXfy9ddfBy2/fv16rr32Wpo0aULTpk25+uqrWbNmDdnZ2RhjKvyF86VLlzJ8+HA6duxIo0aNaNy4MV27duXJJ5/kxIkT5coaY1i4cCEAHTp08HfrpKWl+cv07t0bY4z/68WLF2OMYeLEiUHrW1RURHJyMi1btqzQ9bN48WKuuuoqkpOTadCgAZ07d2bGjBkUFRV5bT6JAF1RS9S65557ePrpp/nLX/7CvffeS8eOHSv9zAsvvMAdd9xBYmIiAwYMoG3btnz++efMmzePt956i7Vr15a7gl29ejXXXnstxcXF3HTTTaSnp7Nt2zauuuoqMjMzg+7jwQcfJC4uju7du9O6dWsOHTrE+++/z/jx41m/fj0vvviiv+y0adNYunQpW7ZsYfz48SQlJQH4/w1m4MCBNGvWjNzcXB5//HHi48t/G7/xxhsUFhYyadKkcuvGjBnD/PnzadOmDYMGDSIpKYm1a9cydepU3nvvPVauXFlhW+KG6P9fCRzpoFEFdUpCQgKPPvooN998Mw8++CCvvfbaKcvv2rWLO++8k7S0NPLz82ndurV/3fvvv88111zD+PHjef311wE4ceIEo0eP5ujRo7z77rv079/fX/7ZZ5/lN7/5TdD9vPPOO6Snp5dbduLECW677TYWLVrEuHHj6N69OwDZ2dns3buXLVu2MGHChHJX0qE0aNCAwYMHM3fuXP7+97/zy1/+stz6siv0wL9gvmDBAubPn8/AgQPJzc2lYcOG/nXZ2dlMnz6dZ555hvHjx1e6f6l96vqQqJaVlcXll1/O66+/zkcffXTKsn/+858pLi4mJyenXEgDZGZmMmDAAN566y2OHDkCwCeffMLu3bu56qqryoU0wNixY0NewZ8c0gBxcXH+EFy+fLnn4wulLITLQrnMN998w/Lly8nIyCj3V8hzcnKIj49n/vz55UIaYOrUqTRv3pzc3Nxq10vCI/qvqKXOmz17Nj169GDSpEmsXbu2XH9uoDVr1gCQn5/P+vXrK6z/9ttvKSkpYdeuXXTt2pXNmzcDcMUVV1QoGxcXR48ePdi1a1eFdd9//z2zZs3i3Xff5YsvvuB///tfufX/+c9/qnyMJ+vRowcdO3bkrbfeoqCggOTkZAByc3MpKSlh1KhR/rI//vgjW7ZsITU1NeQomcTERI0scZiCWqLe5ZdfTlZWFq+88govv/wygwcPDlru+++/B2DWrFmn3N4PP/wAwKFDhwA488wzg5YLtrywsJBLLrmEPXv2cOmllzJixAhSUlKIj4+nsLCQnJycGrtxN3LkSKZMmcKSJUv83TALFy4kISGBoUOH+ssVFBRgreXAgQNVvvEqblDXh8SERx99lISEBB566CGOHTsWtEyzZs2A0gC21oZ8/eIXvwCgadOmAOzfvz/o9oItnzdvHnv27GHatGmsW7eOOXPmMGPGDLKzs0P+ADldt956K3Fxcf7uj82bN7Nt2zauu+46WrRoUeG4MzIyTnncevLRXQpqiQnp6encfffd7Nmzh6eeeipomcsuuwwoHcnhRUZGBkDQvu8TJ07wySefVFi+e/duAG666aYK6/Lz84Pup169egCUlJR4qleZtm3bkpmZybp169i5c2fQm4gAjRs35oILLuCzzz7j4MGDVdqH6+bO/ekVyxTUEjN+//vfk5SUxCOPPOLvvgg0btw4EhIS+O1vfxu0b/nYsWPlQrxnz56kp6eTl5fHsmXLypWdO3du0G2Ujdo4eWz15s2bmTlzZtB6N2/eHCh90rKqyvqin3/+eRYvXkzz5s0rjAIBmDhxIseOHWP06NEUFhZWWF9QUMCmTZuqvH+pHeqjlpiRkpLC5MmTeeCBB4Ku79SpE/Pnz2f06NFccMEF9OvXj44dO1JcXMy+fftYvXo1LVq04J///CdQesNw3rx59OvXjwEDBvjHUW/dupWVK1fSv39/li1bRlzcT9c7I0aMYNasWUyYMIG8vDzOPfdcPv/8c95++20GDRrESy+9VKFeffr0YdasWdxxxx1kZWXRuHFjkpKSGDduXKXHPGjQIJo2bcoTTzxBcXEx9957LwkJCRXKjR49mo0bNzJnzhzS09Pp27cv7dq14+DBg+zZs4cPP/yQ2267jWeffdZrc0st8hzUxph6wAbgP9baij+yJfI0jpz77ruPOXPmhJzgaPjw4fz85z9n9uzZ5OXlsWLFCho1asRZZ51FVlZWhX7kspnrHn74Yd555x0AunfvTl5enn84W1lfNsBZZ53F6tWrefDBB/noo49Yvnw5nTp1Ys6cOVx99dVBg7pv377Mnj2b5557jj/96U8cO3aM9u3bewrqhg0bcvPNN/P8888DFbs9Aj3zzDP079+fZ599llWrVlFYWEhKSgrt2rXj/vvvZ/jw4ZXuTyLDeL2BYIyZCHQDmlYW1N26dbMbNmyogep5UIceeNmxYwedO3eOdDXEp2fPnqxbt45Dhw7RqFGjSFen1rh0HnqZiyNU/3V1yodjDhBjzEZrbbdg6zz1URtj2gDXA/Nqpkoi0eHHH38M2qe7YMECPvnkE6699to6FdISGV67Pp4AHgCahCpgjBkLjAXN9iWxY9++fWRkZHDNNddwzjnncPz4cTZv3sxHH31EUlISs2fPjnQVpQ6oNKiNMb8EvrXWbjTG9A5Vzlo7F5gLpV0fNVZDkQg688wz+fWvf01+fj55eXkUFRXRsmVLbrvtNqZMmRL0cXGRmublironMMAYcx3QAGhqjPmrtVZ3HiTmJScnM2+eevwksirto7bWPmStbWOtTQOGAO8rpEVEao8eeBERcVyVHnix1n4AfBCWmogn1tqQs8OJhJvmA4kMXVFHkXr16lFcXBzpakgdVlxc7J+bRGqPgjqKNGnShMOHD0e6GlKHHT58mCZNQo7SlTBRUEeRlJQUCgoK+O677zh27Jh+DZVaYa3l2LFjfPfddxQUFJCSkhLpKtU5mpQpiiQmJvon0tm7d2+Vp8UUOV316tWjSZMmtGvXjsTExFrZZzge0/ayLxcpqKNMYmIirVq1olWrVpGuiojUEnV9iIg4TkEtIuI4BbWIiOMU1CIijlNQi4g4TkEtIuI4Dc8TEamG2hjvrStqERHHKahFRBynoBYRcZyCWkTEcQpqERHHKahFRBwXW8PzdgeMkzmnGuNkqrKdmtqniEgIsRXUIhJ1amoccrjHM0dyzmp1fYiIOE5BLSLiOAW1iIjjFNQiIo5TUIuIOE5BLSLiOAW1iIjjNI5aROqkSI6LripdUYuIOE5BLSLiOHV91CTN+yEiYaArahERxymoRUQcp6AWEXGcglpExHG6mSgiMSeaxkh7oStqERHHKahFRBynoBYRcZyCWkTEcQpqERHHKahFRBynoBYRcZzGUYtIrYu1cc7hpitqERHHKahFRBynoBYRcZyCWkTEcQpqERHHKahFRBynoBYRcZzGUYtI2ASOlx6rv/d82nRFLSLiuLp9Rb074Mf9ObX047429xmJ4xORGqcrahERxymoRUQcp6AWEXGcglpExHEKahERx9XtUR8iEhXq+vzVuqIWEXGcglpExHEKahERxymoRUQcp6AWEXGc26M+doe41VudeStCbbMqn6vq/k93ny7S/CEitU5X1CIijqv0itoY0xZYBLQETgBzrbU54a6YiEQPL+Oca6pMXeSl6+M4MMlau8kY0wTYaIxZaa39vzDXTURE8ND1Ya39r7V2k+/9EWAH0DrcFRMRkVJV6qM2xqQBGcC6IOvGGmM2GGM2HDhwoGZqJyIi3oPaGNMYeBWYYK09fPJ6a+1ca203a223Fi1a1GQdRUTqNE9BbYxJoDSkc621r4W3SiIiEqjSoDbGGOB5YIe19o/hr5KIiATyckXdE7gVyDTG/MP3ui7M9RIREZ9Kh+dZaz8CTC3URUQcFDi2eaweRo0Itx8hD6U2H8kOtq9YeiRcRJynR8hFRBynoBYRcZyCWkTEcQpqERHHKahFRBynoBYRcVx0Ds8TkRpRnTHSmju69uiKWkTEcQpqERHHKahFRBynoBYRcZxuJoaL5gORGNEpPvBc1qxMkaArahERxymoRUQcp6AWEXGcglpExHEKahERxymoRUQcp6AWEXGcglpExHEKahERxymoRUQcp0fIRRxTnTmia3ObUnvcC2rNkRE5gW1/jofv5uqUDxT4WS9lqlqfqtbzdFWn7l62Gc661/a+wiBwTpJ/Ho+++p+Kuj5ERBynoBYRcZyCWkTEcQpqERHHKahFRBynoBYRcZx7w/NEJKjaHAsduK9O8cGXS+3RFbWIiOMU1CIijlNQi4g4TkEtIuK42L2ZGA3zFniZ1yRU3cM9L0dN8XKM1ZnfpabmhgnWPl7mDqmJ/VTYZhX/f6q6TQ/7Cpw3wwsv82xUZy6OUPWpzpweweoTqo6RnkdEV9QiIo5TUIuIOC52uz5EosiHH9beNqu6XCJPV9QiIo5TUIuIOE5BLSLiOAW1iIjjFNQiIo5TUIuIOE5BLSLiuLoxjrqmHjOOhOo8Kl6dMtUpX0MCx/X2IngdQo39DVX+tOd09tgGweoTWBcvx+RpP/N/+myvXpWXD/UIdnUeFa9OmVDlQz22XR1VfbzdRbqiFhFxnIJaRMRxCmoREccpqEVEHKegFhFxnIJaRMRxCmoREcdF3TjqcuNQPYwfjVXl2uGcCO03RPsHjlXu5OEMC9xOpOZEDtWeXo73dOvs5XOaI1pAV9QiIs5TUIuIOE5BLSLiuKjrow6baJgPpDbrWI19uT5vgl+oY4zwuVCteTmi4TyuQeE811w6j3VFLSLiOAW1iIjjFNQiIo6Lij7qUGNJvYwxDTVG18vY3eqM7/UyxttLfbzUwcu45XAcS+B2/vl+5XUIJVLjiau6TVfH8GusdezTFbWIiOMU1CIijlNQi4g4TkEtIuI4T0FtjOlnjNlpjNltjHkw3JUSEZGfVBrUxph6wDNAf+B8YKgx5vxwV0xEREp5uaK+FNhtrf3CWnsMWALcEN5qiYhIGWOtPXUBY7KAftba231f3wp0t9aOO6ncWGCs78vzgJ2n2Gwq8N3pVroOU7udHrXb6VG7nZ7Tbbf21toWwVZ4eTTBBFlWId2ttXMBT7OYGGM2WGu7eSkrP1G7nR612+lRu52ecLSbl66Pr4C2AV+3Ab6uyUqIiEhoXoJ6PXCuMaaDMaY+MAR4M7zVEhGRMpV2fVhrjxtjxgHLgXrAfGvtZ9XcrzsTvUYXtdvpUbudHrXb6anxdqv0ZqKIiESWnkwUEXGcglpExHE1GtSVPWpujEk0xrzkW7/OGJMWsO4h3/Kdxpi+NVkv13lot4nGmP8zxmw1xrxnjGkfsK7EGPMP36vO3eT10HajjDEHAtro9oB1I40xn/teI2u35pHlod3+FNBmu4wxhQHr6uQ5Z4yZb4z51hizPcR6Y4x50temW40xXQLWVe9cs9bWyIvSG43/As4G6gNbgPNPKnM38Kzv/RDgJd/7833lE4EOvu3Uq6m6ufzy2G5XAWf43v+mrN18X/8Q6WNwvO1GAU8H+WwK8IXv32Tf++RIH5Mr7XZS+XspHURQp885oBfQBdgeYv11wDJKnz25DFjnW17tc60mr6i9PGp+A7DQ9/4VoI8xxviWL7HWFllr9wC7fdurCyptN2ttnrX2R9+Xaykdyy7Vm96gL7DSWnvQWlsArAT6hamerqlquw0FFtdKzRxmrf0QOHiKIjcAi2yptUCSMaYVNXCu1WRQtwb+HfD1V75lQctYa48Dh4DmHj8bq6p67GMo/aldpoExZoMxZq0x5sZwVNBhXtvuJt+voq8YY8oe3tI595OQx+7rZusABPyxtTp9zp1KqHat9rlWk38z0cuj5qHKeHpMPUZ5PnZjzHCgG/CLgMXtrLVfG2POBt43xmyz1v4rDPV0kZe2ewtYbK0tMsbcRelvdJkePxurqnLsQ4BXrLUlAcvq8jl3KmHLt5q8ovbyqLm/jDEmHmhG6a8SdfkxdU/Hboy5GpgCDLDWFpUtt9Z+7fv3C+ADICOclXVMpW1nrf0+oL2eA7p6/WwMq8qxD+Gkbo86fs6dSqh2rf65VoMd7fGUdpJ34KcbFBecVOYeyt9MfNn3/gLK30z8grpzM9FLu2VQevPn3JOWJwOJvvepwOec4qZQrL08tl2rgPcDgbW+9ynAHl8bJvvep0T6mFxpN1+584C9+B6M0zlnAdIIfTPxesrfTPy0ps61mj6I64BdvlCZ4lv2B0qvAgEaAP+P0puFnwJnB3x2iu9zO4H+kf4PqeX//MrabRWwH/iH7/Wmb3kPYJvvG20bMCbSx+Jg280EPvO1UR7QKeCzo33n4m7gtkgfi0vt5vs6G3j0pM/V2XOO0t8s/gsUU3qVPAa4C7jLt95Q+kdW/uVrm241da7pEXIREcfpyUQREccpqEVEHKegFhFxnIJaRMRxCmoREccpqEVEHFeTj5CLOMMYk03pQwfHfYviKZ3QqsIya212bddPpCoU1BLLhlhrCwGMMUnAhBDLRJymrg8REccpqEVEHKegFhFxnIJaRMRxCmoREccpqEVEHKfheRKrvgUWGWNO+L6OA/4eYpmI0zQftYiI49T1ISLiOAW1iIjjFNQiIo5TUIuIOE5BLSLiuP8PGm9at6r7L+QAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.distplot(評価行列[評価行列.ラベル == 1].確率, kde=False, bins=100, color='blue', label='Positive', norm_hist=True)\n",
    "sns.distplot(評価行列[評価行列.ラベル == 0].確率, kde=False, bins=100, color='orange', label='Negative', norm_hist=True)\n",
    "\n",
    "plt.rcParams[\"figure.figsize\"] = (20, 10)\n",
    "plt.rcParams[\"font.size\"] = 20\n",
    "plt.rcParams[\"axes.labelsize\"] = 10\n",
    "plt.legend();"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Prodigyでのアノテーション　　\n",
    "[Prodigy](https://prodi.gy/)はウェブ上で動くアノテーションツールでユーザー自身がタグ付けします。アクティブラーニングによりモデルが自信のないデータをユーザーにタグ付けさせます。アノテーションの方法やインターフェースはレシピと呼ばれるもので定義され、標準で文章分類、固有表現抽出、 画像認識、そして物体検出のレシピを搭載しています。自作レシピも可能です。　　\n",
    "\n",
    "***このツールはオープンソースではありませんのでライセンスが必要になります。オープンソースのツールでは [doccano](https://github.com/doccano/doccano)がおすすめです。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1970, 2)"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "行列 = pd.read_csv('data/train.tsv.bz2', sep='\\t', compression='bz2', names=['テキスト', 'ラベル'])\n",
    "行列.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "# アノテーション用にテキストだけcsvで保存する\n",
    "行列.テキスト.to_csv(\"data/test_prodigy.csv\", header=False, index=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Prodigyの起動　　\n",
    "1. ウェブアプリを起動します。\n",
    "2. ブラウザで`localhost:8888`に接続します。　　\n",
    "\n",
    "### Prodigyでのアノテーション　　\n",
    "1. 学習済みモデルを選び、手動でアノテーションします(1000個ほど):  \n",
    "`prodigy ner.teach my_set en_core_web_lg data/test_prodigy.csv`  \n",
    "2. モデルを学習します:  \n",
    "`prodigy train ner my_set en_core_web_lg --output model/ner_v1 --n-iter 5 --eval-split 0.2 --dropout 0.2`  \n",
    "3.  `ner.correct`と`train`を精度が上がるまで交互に実行します:  \n",
    "`prodigy ner.correct my_set model/ner_v1 data/test_prodigy.csv`  \n",
    "`prodigy train ner my_set en_core_web_lg --output model/ner_v2 --n-iter 5 --eval-split 0.2 --dropout 0.2`  \n",
    "`prodigy ner.correct my_set model/ner_v2 data/test_prodigy.csv`  \n",
    "...\n",
    "4. 完了です。学習されたモデルはspaCy使用できます。\n",
    "5. 更にラベル付けされたデータをJSONLファイルに出力する事も可能です:\n",
    "`prodigy ner.gold-to-spacy my_set data/ner_gold.jsonl --biluo --spacy-model model/ner_v8`\n",
    "6. 出力されたデータを他のフレームワークと使って学習する事もできます。例えば、AllenNLP用に変換するには下記を参照してください。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import json\n",
    "\n",
    "with open('data/ner_gold.jsonl') as jsonファイル:\n",
    "    prodigyゴールド = [json.loads(ライン) for ライン in jsonファイル]\n",
    "    \n",
    "nerリスト = []\n",
    "for 行 in prodigyゴールド:\n",
    "    テキスト = 行[0]\n",
    "    ラベル = 行[1]\n",
    "    \n",
    "    連結テキスト = \"\"\n",
    "    カウンタ = 0\n",
    "    \n",
    "    for テキスト in テキスト.split(\" \"):\n",
    "        ラベル付きテキスト = テキスト + \"#\" + ラベル[カウンタ]\n",
    "        連結テキスト = 連結テキスト + ラベル付きテキスト + \" \"\n",
    "        カウンタ += 1\n",
    "\n",
    "    nerリスト.append(連結テキスト.strip())\n",
    "\n",
    "ner行列 = pd.DataFrame(nerリスト, columns=['テキスト'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 学習データと評価データに分ける\n",
    "学習X, 評価X = train_test_split(ner行列, test_size=0.2, random_state=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# データを保存する\n",
    "学習X.to_csv(\"data/ner_train_allennlp.csv.bz2\", compression='bz2', header=False, index=False)\n",
    "評価X.to_csv(\"data/ner_val_allennlp.csv.bz2\", compression='bz2', header=False, index=False)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
